一、JDK 监控工具
1.1 jps: jvm进程状况工具
显示指定系统内的所有HotSpot进程,命令格式:
jps [option] [ hostid]
hostid为RMI注册表中注册的主机名
选项 | 作用 |
---|---|
-q | 值输出LVMID |
-m | 输出虚拟机进程启动的传递给main的参数 |
-l | 输出主类全类名;若果时jar、war显示jar、war名称 |
-v | 输出虚拟机进程启动时JVM参数 |
1.2 jstat:jvm统计信息监视工具
用于收集HotSpot个方面的运行数据,包括类装载、内存、垃圾回收、JIT等运行数据,在没有GUI界面,它将是jvm性能问题的首选项。
jstat [option vmid [interval[m|ms] [count] ] ]
如果是远程程序 vmid变成 [protocal:][//]vmid[@hostname[:port]/servername]
Option主要分为三类:1.类装载;2垃圾回收;3.运行期编译状况。
选项 | 作用 |
---|---|
-class | 监视类的装载、卸载数量、总空间以及类装载所好烦的时间 |
-gc | 监视类Java堆状况,包括Eden区、两个survivor区, 看各个区域的使用大小 |
-gccapacity | 显示各个代的容量以及使用情况; |
-gcmetacapacity | 显示metaspace的大小 |
-gcnew | 显示新生代信息; |
-gcnewcapacity | 显示新生代大小和使用情况; |
-gcold | 显示老年代和永久代的信息; |
-gcoldcapacity | 显示老年代的大小; |
-gcutil | 显示垃圾收集信息, 看各个区域的使用百分比; |
-gccause | 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因; |
-printcompilation | 输出JIT编译的方法信息; |
C:\Program Files\Java\jdk1.8.0_181\bin>jstat -gc 15800
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
5120.0 5120.0 0.0 5097.8 33280.0 17026.3 87552.0 754.3 20992.0 20348.8 2560.0 2367.3 3 0.026 0 0.000 0.026
1.3 jinfo: java配置信息工具
jinfo -flags 2289 查看启动参数
显示jvm配置信息,+或- 配置jvm参数
1.4 jmap:java内存映象工具
用于生成堆转储快照,还可以参看finalize执行队列,java堆、永久代的详情,如空间使用率,哪种垃圾回收器等。
选项 | 作用 |
---|---|
-dump | 生成java堆转储快照 |
-finalizerinfo | 等待F你那里责任线程执行finalizer方法的对象。只在Linux、Solaris有效 |
-heap | 堆详情,如:使用哪种回收期、参数配置、分代等只在Linux、Solaris有效 |
-histo | 显示在队中对象统计信息。包括类、实例数量、合计容量 |
-permstat | ClassLoader为统计接口用接待内存状态只在Linux、Solaris有效 |
-F | 强制输出dump快照。只在Linux、Solaris有效 |
jmap -dump:format=b,file=heap.hprof 31531
获得堆快照文件之后,我们可以使用多种工具对文件进行分析,例如jhat,visual vm等。
1.5 jhat:jvm堆转储快照分析工具
使用jhat工具可以分析Java应用程序的堆快照文件,使用命令如下:
jhat heap.hprof
jhat在分析完成之后,使用HTTP服务器展示其分析结果,在浏览器中访问http://127.0.0.1:7000/即可得到分析结果。
1.6 jstack : java堆栈跟踪工具
用于生成kvm当前线程的快照(threadtump或javacore工具)
选项 | 作用 |
---|---|
F | 强制输出线程堆栈 |
l | 附加关于锁的信息 |
m | 本地方法,可以显示c/c++堆栈 |
1.7 HSDIS: JIT代码生成反汇编
让HotSpot的-XX:+printAssembly指令调用它来把动态代码生成的本地代码还原成汇编输出。
1.8 jstatd命令
jstatd命令是一个RMI服务器程序,它的作用相当于代理服务器,建立本地计算机与远程监控工具的通信,jstatd服务器能够将本机的Java应用程序信息传递到远程计算机,由于需要多台计算机做演示,此处略。
1.9 hprof工具
hprof工具可以用于监控Java应用程序在运行时的CPU信息和堆信息,关于hprof的官方文档如下:https://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html
2 jdk可视化工具
2.1 jconsole
2.2 VisualVM
2.3 MAT内存分析工具
MAT是一款功能强大的Java堆内存分析器,可以用于查找内存泄露以及查看内存消耗情况,MAT的官方文档如下:http://help.eclipse.org/luna/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html。
在MAT中有浅堆和深堆的概念,浅堆是指一个对象结构所占用的内存大小,深堆是指一个对象被GC回收后可以真正释放的内存大小。
通过MAT,可以列出所有垃圾回收的根对象,Java系统的根对象可能是以下类:系统类,线程,Java局部变量,本地栈等等。在MAT中还可以很清楚的看到根对象到当前对象的引用关系链。
MAT还可以自动检测内存泄露,单击菜单上的Leak Suspects命令,MAT会自动生成一份报告,这份报告罗列了系统内可能存在内存泄露的问题点。
在MAT中,还可以自动查找并显示消耗内存最多的几个对象,这些消耗大量内存的大对象往往是解决系统性能问题的关键所在。
3. Arthas - Java
官网:https://alibaba.github.io/arthas
强大功能:
- 是否有一个全局视角来查看系统的运行状况?
- 为什么 CPU 又升高了,到底是哪里占用了 CPU ? 运行的多线程有死锁吗?有阻塞吗?
- 程序运行耗时很长,是哪里耗时比较长呢?如何监测呢?
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 有什么办法可以监控到 JVM 的实时运行状态?
3.1 下载与启动:
arthas-boot.jar,然后用java -jar的方式启动:
# 运行方式1,先