JVM学习java进阶干货JVM · Java虚拟机原理 · JVM上语言·框架· 生态系统

JVM性能监控与如何解决故障

2017-09-12  本文已影响175人  编程界的小学生
名称 主要作用
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

Paste_Image.png

只显示了唯一ID(理解成进程号)和jar这个简略的名称。

jps -q

Paste_Image.png

更过分了,只显示了进程号。毫无意义。

jps -l

Paste_Image.png

显示了jar的全名称,我是脚本启动的jar,所以只显示了名称,若非脚本启动,则会显示jar的全路径。

jps -m

Paste_Image.png

显示了我给main方法传递的参数,这里传了端口号(--server.port)

jps -v

Paste_Image.png

可以看出我们这个jar包设置了最大最小内存为128m。

还可以组合用
jps -l -v

Paste_Image.png

这样我们既查看了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查出我们的进程号

Paste_Image.png

jstat -class 22167 1000 3 每隔一秒钟输出进程号是22167的class装载卸载等信息,输出3次。

Paste_Image.png

jstat -gcutil 22167 省略最后两个参数代表只输出一次结果。

Paste_Image.png

三、jinfo:Java配置信息工具
1、格式
jinfo [option] pid

2、参数列表

-flag <name>:打印指定JVM的参数值
-flag [+|-]<name>:设置指定JVM参数的布尔值
-flag <name>=<value>:设置指定JVM参数的值

3、实战
jinfo -flag MaxTenuringThreshold 22167 显示新生代对象晋升到老年代对象的最大年龄

Paste_Image.png

jinfo -flag PrintGCDetails 22167 显示是否打印GC详细信息

Paste_Image.png
不打印,因为是-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的部分截图

Paste_Image.png

jmap -dump:format=b,file=/tmp/heap.hprof 30773 打出dump堆,利于分析。

Paste_Image.png

这时候就可以借助分析dump工具进行分析了。

五、jstack:Java堆栈跟踪工具
1、格式
jstack [option] vmid

2、参数列表

-F:当正常输出的请求不被响应时,强制输出线程堆栈。
-l:除堆栈外,显示关于锁的附加信息。
-m:如果调用到本地方法的话,可以显示C/C++的堆栈(native方法)。

3、实战
jstack 30773 >>/tmp/jstack.txt 打印进程号是30773的信息到jstack.txt文件

Paste_Image.png

六、如何解决故障
JDK自己提供了的性能监控可视化工具。

1、JConsole

2、VisualVM
这两个是可视化工具的使用,上网搜搜资料就会了。此处不讲解。
通过VisualVM可以让开发者发现各种异常情况,比如死锁,堆溢出等等。

若有兴趣,欢迎来加入群,【Java初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
欢迎关注我的微信公众号【Java码农社区】,会定时推送各种干货:


qrcode_for_gh_577b64e73701_258.jpg
上一篇下一篇

猜你喜欢

热点阅读