JVM调优问题简单总结

标签:ror   visualvm   速度   %x   command   就是   grep   oom   ESS   

JVM调优问题简单总结

jvm调优在我看来就是扩扩内存,修改一下虚拟机运行参数,再不行换个垃圾回收器,比如G1什么的。

但是,对运行时问题的定位却是个大问题,今天就来总结一下,这两天学习的关于jvm调优的一些查用的排查方式

CPU突然飙升怎么排查

因为在服务器上不只有Java进程还有其他进程,所以需要使用top命令进行查看,来,top命令

Linux top命令用于实时显示 process 的动态。

使用权限:所有使用者。

语法

top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]

参数说明

  • d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s
  • q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行
  • c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称
  • S : 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来
  • s : 安全模式,将交谈式指令取消, 避免潜在的危机
  • i : 不显示任何闲置 (idle) 或无用 (zombie) 的行程
  • n : 更新的次数,完成后将会退出 top
  • b : 批次档模式,搭配 "n" 参数一起使用,可以用来将 top 的结果输出到档案内

使用截图(以我的服务器为例)

image-20201223210338771

可以看到有很多的进程在运行.然后我们需要寻找的时java进程..貌似没有,搞错服务器了......

我们换个服务器重新来一次

image-20201223210732627

这次可以看到啊,有Java进程在运行,然后可以看到用了0.3%的cpu,很少哈.如果说达到99%就说明时Java程序出问题了,就让我们假设Java程序出了问题,来看看具体的Java中线程 使用的是top -Hp pid

image-20201223210941838

这样就可以看到有很多的Java线程在运行,就是圈主的那些,然后可以观察哪个线程占用最高,然后啊,因为这里是10进制,而在线程堆栈中显示的是16进制,可以使用windows自带的计算器进行计算哈,如图

image-20201223211240202

看人家多贴心这里的选中DEC后输入数字就行了,然后查看HEX对应的值

不过我这里选的是另外一种方法,printf ‘%x\n‘ pid转换 假设出问题的线程是16949

image-20201223211533304

然后使用jstack pid|grep 16进制的线程pid号进行查看

这里我的jstack命令不能用了...所以没办法截图,正常情况下是显示该线程的信息

OOM怎么排查

这里OOM(OutOfMemoryError)溢出肯定是Java线程嘛,所以可以直接使用jps,查看正在运行的Java线程

image-20201223212837440

然后使用jmap -histo命令查看,我们一般都是使用head -20查看前20行,看看是哪些对象占用的比较多.

补充

  1. 系统CPU经常100%,如何调优?(面试高频) CPU100%那么一定有线程在占用系统资源,
    1. 找出哪个进程cpu高(top)
    2. 该进程中的哪个线程cpu高(top -Hp 进程id)
    3. 导出该线程的堆栈 (jstack)
    4. 查找哪个方法(栈帧)消耗时间 (jstack)
    5. 工作线程占比高 | 垃圾回收线程占比高(垃圾回收线程占比高的话说明堆内存快满了,每次full GC都只能回收一点数据,需要不停的进行回收)
  2. 系统内存飙高,如何查找问题?(面试高频) 你
    1. 导出堆内存 (jmap)
    2. 分析 (jhat jvisualvm mat jprofiler ... )

JVM调优问题简单总结

标签:ror   visualvm   速度   %x   command   就是   grep   oom   ESS   

原文地址:https://www.cnblogs.com/clion/p/14181545.html

版权声明:完美者 发表于 2020-12-29 11:44:09。
转载请注明:JVM调优问题简单总结 | 完美导航

暂无评论

暂无评论...