1、定位系统问题依据GC日志堆转储快照(heapdump/hprof文件)线程快照(threaddump/javacore文件)运行日志异常堆栈分析依据的工具jps:显示指定系统内的所有JVM进程jstat:收集JVM各方面的运行数据jinfo:显示JVM配置信息jmap:形成堆 ...
1、定位系统问题
- 依据
- GC日志
- 堆转储快照(heapdump/hprof文件)
- 线程快照(threaddump/javacore文件)
- 运行日志
- 异常堆栈
- 分析依据的工具
- jps:显示指定系统内的所有JVM进程
- jstat:收集JVM各方面的运行数据
- jinfo:显示JVM配置信息
- jmap:形成堆转储快照(heapdump文件)
- jhat:分析heapdump文件
- jstack:显示JVM的线程快照
- jconsole
- visualVM
说明:后边两种是具有图形化界面的。
2、jps(是其他所有命令的基础)
作用:列出所有的JVM虚拟机进程。
格式:jps -l
3、jstat(是没有GUI界面的情况下,在运行期定位JVM性能问题的首选)
作用:查看gc数据和类加载卸载数据
格式:jstat option PID interval count
意义:每隔interval毫秒做一次option,一共做count次
说明:S0(from区)使用了41.74%;S1(to区)使用了0;E(Eden区)使用了54.35%;O(Old,年老代)使用了62.41%;P(Perment,永久代)使用了99.63%;YGC(Young GC)了32次,YGCT(Young GC Time)花销0.132秒;FGC(Full GC)了1次,FGCT(Full GC Time)花销0.102秒;GCT(GC Time)总花销0.234秒。
分析:其实上边这个查询结果可以直接看出,我们需要加大P(永久代大小)
说明:加载了3683个类,总共占有4355.3字节;卸载了0个类,卸载的类的字节数为0,类的加载与卸载共花销3.16秒
更多的jstat的使用,参看http://my.oschina.net/skyline520/blog/304805
4、jinfo
作用:查看和运行期修改JVM的配置参数
格式:jinfo -flag parameter PID
说明:查看3732进程下的MaxTenuringThreshold参数值。
说明:修改3732进程下的MaxTenuringThreshold参数值,但是windows下失败。
5、jmap
作用:生成堆转储快照和查看最占内存的元素,用于分析内存泄露问题
格式(生成堆转储快照):jmap -dump:format=b,file=文件名 PID
说明:生成了3732进程的堆转储文件myfile
格式(查看最占内存的元素):jmap -histo PID
说明:结果自己去看,太多了
6、jhat
作用:分析堆转储快照(与jmap配合)
格式:jhat 文件名
说明:执行上述命令后,打开localhost:7000,找到如下红框部分打开,这里才是我们最关注的东西。
注意:该工具是万不得已才用的。
推出命令使用"ctrl+c"
7、jstack
作用:生成线程快照,定位线程长时间卡顿的原因(线程间死锁、死循环、请求外部资源导致的长时间等待)
格式:jstack -l PID
说明:查看3732进程中的所有线程的堆栈信息
《深入理解Java虚拟机》的作者提供了一个工具jsp页面,使得我们可以在程序运行时,随时运行该jsp页面,来查看线程堆栈信息,代码如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8" import="java.util.Map"%> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>jstack</title> 8 </head> 9 <body>10 <% 11 for(Map.Entry<Thread, StackTraceElement[]> stackTrace : Thread.getAllStackTraces().entrySet()){12 Thread thread = (Thread)stackTrace.getKey();13 StackTraceElement[] elements = (StackTraceElement[])stackTrace.getValue();14 15 /* if(thread.equals(Thread.currentThread())){16 continue;17 } */18 out.println("\n线程:"+thread.getName()+"\n");19 for(StackTraceElement ele : elements){20 out.println("\t"+ele+"\n");21 }22 }23 %>24 </body>25 </html>
原标题:第七章 JVM性能监控与故障处理工具(1)
关键词:jvm
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。