如何定位JVM的问题

来源:互联网 发布:软件运营方案书 编辑:程序博客网 时间:2024/06/05 03:08
1.top oder by with P:1040 // 首先按进程负载排序找到 axLoad(pid)
2.top -Hp 进程PID:1073 // 找到相关负载 线程PID
3.printf “0x%x\n”线程PID: 0×431 // 将线程PID转换为 16进制,为后面查找 jstack 日志做准备
4.jstack 进程PID | vim +/十六进制线程PID – // 例如:jstack 1040|vim +/0×431 -
可以看到CPU消耗在某个类的上耗时最长

但是对于线上问题定位来说,分秒必争,上面的 3步还是太繁琐耗时了,有没有可能封装成为一个工具,在有问题的时候一键定位,秒级找到有问题的代码行呢?

当然可以!工具链的成熟与否不仅体现了一个开发者的运维能力,也体现了开发者的效率意识。淘宝的oldratlee 同学就将上面的流程封装为了一个工具:show-busy-java-threads.sh(点击可直接下载,或参考文末链接下载),可以很方便的定位线上的这类问题,
4.  jmap用来查看堆内存使用状况,一般结合jhat使用。
jmap -permstat pid


 打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息,如下图:
5.还有一个很常用的情况是:用jmap把进程内存使用情况dump到文件中,再用jhat分析查看。jmap进行dump命令格式如下:
jmap -dump:format=b,file=dumpFileName
   dump出来的文件可以用MAT、VisualVM等工具查看,这里用jhat查看:
jhat -port 9998 /tmp/dump.dat
6.jstat(JVM统计监测工具)
语法格式如下:jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
  
vmid是虚拟机ID,在Linux/Unix系统上一般就是进程ID。interval是采样时间间隔。count是采样数目。比如下面输出的是GC信息,采样时间间隔为250ms,采样数为4:
jstat -gc 21711 250 4
S0C、S1C、S0U、S1U:Survivor 0/1区容量(Capacity)和使用量(Used)
EC、EU:Eden区容量和使用量
OC、OU:年老代容量和使用量
PC、PU:永久代容量和使用量
YGC、YGT:年轻代GC次数和GC耗时
FGC、FGCT:Full GC次数和Full GC耗时
GCT:GC总耗时