JVM性能监控与如何解决故障
名称 | 主要作用 |
---|---|
jps | JVM Process Status Tool,显示指定系统内的所有HotSpot虚拟机进程。(相当于linux的ps查看进程) |
jstat | JVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方便的运行数据。(比如查看GC,查看堆内存空间以及类装载卸载数目等) |
jinfo | Configuration Info for Java,显示虚拟机配置信息。(可以查看当前虚拟机的运行参数以及可以动态修改JVM运行参数,比如打开GC打印等) |
jmap | Memory Map for Java,生成虚拟机的内存转储快照(heapdump文件,很实用,我们可以利用jmap生成dump,助于我们分析) |
jhat | JVM Heap Dump Browser,用于分析heapdump文件,他会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果。(此处不讲解这个命令,因为他有很多可替代的产品,比如VisualVM可视化工具等) |
jstack | Stack Trace for java,显示虚拟机的线程快照。(助于我们分析,可以分析出哪里死循环,哪里线程死锁了等) |
一、jps:虚拟机进程状况工具
1、格式
jps [参数] [hostid]
2、参数列表
-q:只输出LVMID(就是本地虚拟机唯一ID,可以粗略理解为进程号)。
-m:输出虚拟机进程启动时传递给主类main()函数的参数。
-l:输出主类的全名,若进程执行的是jar包,则输出jar的路径。(很有效,直接帮我们找到是哪个类)
-v:输出虚拟机进程启动时的JVM参数。(比如Xmx,Xms等)。
3、实战
jps
只显示了唯一ID(理解成进程号)和jar这个简略的名称。
jps -q
更过分了,只显示了进程号。毫无意义。
jps -l
显示了jar的全名称,我是脚本启动的jar,所以只显示了名称,若非脚本启动,则会显示jar的全路径。
jps -m
显示了我给main方法传递的参数,这里传了端口号(--server.port)
jps -v
可以看出我们这个jar包设置了最大最小内存为128m。
还可以组合用
jps -l -v
这样我们既查看了jar的全路径又查看了他的JVM运行参数。
二、jstat:虚拟机统计信息监视工具
1、格式
jstat [参数] [vmid] [interval(s|ms)] [count]
说明下:VMID与LVMID区别:若是本地JVM进程,则一样,若是远程的JVM,则VMID格式应该是如下:
[protocol:][//]lvmid[@hostname[:port]/servername]
2、参数列表
主要分为3类(类装载、垃圾收集、运行期编译状况)。
-class:监视类装载、卸载数量、总空间以及类装在所耗费的时间。
-gc:监视Java堆状况,包括Eden区、两个survivor区、老年代和永久代等的容量、已用空间、GC时间合计等。
-gccapacity:监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间。
-gcutil:监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。
-gccause:与-gcutil功能一样,但是会额外输出导致山上一次GC产生的原因。
-gcnew:监视新生代GC状况。
-gcnewcapacity:监视新内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间。
-gcold:监视老年代GC状况。
-gcoldcapacity:监视新内容与-gcold基本相同,输出主要关注使用到的最大、最小空间。
-gcpermcapacity:输出永久代使用到的最大、最小空间。
-complier:输出JIT编译器编译过去的方法、耗时等信息。
-printcompliation:输出已经被JIT编译的方法。
3、实战
参数太多了,这里只演示其中几个。
首先通过jps -l
查出我们的进程号
jstat -class 22167 1000 3
每隔一秒钟输出进程号是22167的class装载卸载等信息,输出3次。
jstat -gcutil 22167
省略最后两个参数代表只输出一次结果。
三、jinfo:Java配置信息工具
1、格式
jinfo [option] pid
2、参数列表
-flag <name>:打印指定JVM的参数值
-flag [+|-]<name>:设置指定JVM参数的布尔值
-flag <name>=<value>:设置指定JVM参数的值
3、实战
jinfo -flag MaxTenuringThreshold 22167
显示新生代对象晋升到老年代对象的最大年龄
jinfo -flag PrintGCDetails 22167
显示是否打印GC详细信息
不打印,因为是-PrintGCDetails
那就给他改成打印(注意,我们程序在运行中,我们要在运行的环境中修改运行时JVM参数)
jinfo -flag +PrintGCDetails 22167
jinfo -flag PrintGCDetails 22167
Paste_Image.png
四、jmap:Java内存映像工具
1、格式
jmap [option] vmid
2、参数列表
-dump:生成Java堆转储快照。格式为: -dump:[live,]format=b,file=<filename>,其中live子参数说明是否只dump出存活的对象。
-finalizerinfo:显示在F-Queue中等待Finalizer线程执行finalize方法的对象。(此参数windows下无效)
-heap:显示Java堆详细信息,如使用哪种回收器、参数配置、分代状况等。(此参数windows下无效)
-histo:显示堆中对象统计信息,包括类、实例数量和合计容量。
-permstat:以ClassLoader为统计口径显示永久代内存状态。(此参数windows下无效)
-F:当虚拟机进程对-dump选项没有响应时,可以用这个选项强制生成dump快照。(此参数windows下无效)
3、实战
jmap -histo 30773 >/tmp/test.txt
生成Java应用程序的堆快照和对象的统计信息(生成到/tmp下的test.txt),如下是test.txt的部分截图
jmap -dump:format=b,file=/tmp/heap.hprof 30773
打出dump堆,利于分析。
这时候就可以借助分析dump工具进行分析了。
五、jstack:Java堆栈跟踪工具
1、格式
jstack [option] vmid
2、参数列表
-F:当正常输出的请求不被响应时,强制输出线程堆栈。
-l:除堆栈外,显示关于锁的附加信息。
-m:如果调用到本地方法的话,可以显示C/C++的堆栈(native方法)。
3、实战
jstack 30773 >>/tmp/jstack.txt
打印进程号是30773的信息到jstack.txt文件
六、如何解决故障
JDK自己提供了的性能监控可视化工具。
1、JConsole
2、VisualVM
这两个是可视化工具的使用,上网搜搜资料就会了。此处不讲解。
通过VisualVM可以让开发者发现各种异常情况,比如死锁,堆溢出等等。
若有兴趣,欢迎来加入群,【Java初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
欢迎关注我的微信公众号【Java码农社区】,会定时推送各种干货:
qrcode_for_gh_577b64e73701_258.jpg