内容来源于《深入理解Java虚拟机》-周志明
性能检测工具-JDK命令行工具
jps 虚拟机进程状况工具
命令格式:jps [options] [hostid] options选项参数 hostid为RMI表中注册主机名
主要选项:
-q 只输出LVMID(本地虚拟机唯一ID),省略主类的名称
-m 输出虚拟机进程启动时传递给主类main() 函数的参数
-l 输出主类的全名,如果进程执行的时Jar 包,输出Jar 路径
-v 输出虚拟机进程启动时JVM参数
示例:
![](https://i-blog.csdnimg.cn/blog_migrate/915769cf5bc6016478b1155721e86a16.png)
jstat 虚拟机统计信息监视工具
用于监视虚拟机各种运行状态信息,它可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
命令格式:jstat [ option vmid [ interval [s|ms] [count] ]
命令中VMID与LVMID区别,如果是本地虚拟机进程,二者一致,如果是远程虚拟机进程,那VMID的格式:
[protocol:] [//] lvmid[@hostname[:port]/servername]
参数interval 和 count 分别代表 查询间隔 和 次数,如果省略只查一次。假设需要每250毫秒查询一次进程为4884垃圾收集状况,一共查询20次,那命令为:
jstat -gc 4884 250 20
主要参数:
- -class (类加载器)
- -compiler (JIT)
- -gc (GC堆状态)
- -gccapacity (各区大小)
- -gccause (最近一次GC统计和原因)
- -gcnew (新区统计)
- -gcnewcapacity (新区大小)
- -gcold (老区统计)
- -gcoldcapacity (老区大小)
- -gcpermcapacity (永久区大小)
- -gcutil (GC统计汇总)
- -printcompilation (HotSpot编译统计)
各参数结果解释可查看: https://blog.csdn.net/u012998254/article/details/81045414
jinfo Java配置信息工具
实时地查看和调整虚拟机各项参数
命令格式:jinfo [option] pid
主要参数:
-flag name 查看系统参数
-flag name=value 修改一部分运行期的系统虚拟机参数
-flag [+|-] name 启动或禁用一部分运行期的虚拟机参数
-flags 查看所有指定的参数
-sysprops 显示应用程序属性
jmap Java内存映像工具
用于生成堆转储快照(heapdump或dump文件),查询finalize 执行队列、Java堆等信息
命令格式:jmap [ option ] vmid
选项参数:
no option 查看进程的内存映像信息
-dump 生成Java转储快照。格式为:-dump:[live,]format=b,file=<filename>,其中live子参数说明是否只dump出存活的对象。
-finalizerinfo 显示在F-Queue 中等待Finalizer 线程执行finalize 方法的对象。只有Linux/Solaris平台有效
-heap 显示堆详细信息,如使用那种回收器、参数配置、分代状况等。只在Linux/Solaris平台有效
-histo 显示堆中对象统计信息,包括类、实例数量、合计容量
-F 当-dump没有响应时,使用-dump或者-histo参数. 在这个模式下,live子参数无效.
其他生成dump文件的方式
1. 参数 -XX:+HeapDumpOnOutOfMemoryError 可以让虚拟机在OOM异常出现之后自动生成dump文件。
2. linux系统下 通过命令 Kill -3 发送进程退出信号"吓唬”一下虚拟机,可以拿到dump文件
案例
jmap -dump:format=b,file=gcdemo.bin 10668
![](https://i-blog.csdnimg.cn/blog_migrate/9ba548db0c18c6bf6171d211508389f8.png)
jhat 虚拟机堆转储快照分析工具
与jmap搭配使用,分析jmap生成的堆转储快照。jhat内置了一个微型的HTTP/HTML 服务器,生成dump 文件的分析结果后,可以在浏览器查看。不过一般不采用该工具查看,而是利用其它专业的工具:如Eclipse Memory Analyzer、IBM HeapAnalyzer 等
命令格式:jhat 文件路径
案例:
![](https://i-blog.csdnimg.cn/blog_migrate/6943d4e5f176b1e011b114e8bc24071b.png)
访问 localhost:7000 查看
![](https://i-blog.csdnimg.cn/blog_migrate/87860a1dcd59306b8810bc8048e9476f.png)
jstack Java堆栈跟踪工具
用于生成虚拟机当前时刻的线程快照(threaddump或javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的时定位线程出现长时间停顿的原因,如线程间锁死、死循环、请求外部资源导致的长时间等待等。
命令格式:jstack [ option ] vmid
可选参数:
-F 当正常输出请求不被响应时,强制输出线程堆栈
-l 除堆栈外,显示关于锁的附加信息
-m 如果调用到本地方法的话,可以显示C/C++的堆栈。
HSDIS JIT生成代码反汇编
HSDIS是一个Sun官方推荐的HotSpot虚拟机JIT编译代码的反汇编插件,他包含在HotSpot虚拟机的源码之中,但没有提供编译后的程序。在Project Kenai的网站也可以下载到单独的源码。他的作用是让HotSpot的-XX : +PrintAssembly指令调用他来把动态生成的本地代码还原为汇编代码输出,同时还生成了大量非常有价值的注释,这样我们就可以通过输出的代码来分析问题。可以根据自己的操作系统和CPU类型从Project Kenai的网站上下载编译好的插件,直接放到JDK_HOME/jre/bin/client和JDK_HOME/jre/bin/server目录中即可。如果没有找到所需操作系统(譬如Windows的就没有)的成品,那就得自己使用源码编译一下。
还需要注意的是,如果使用的是Debug或者FastDebug版的HotSpot,那可以直接通过-XX : +PringAssembly指令使用插件;如果使用的是Product版的HotSpot,那还要额外加入一个-XX : +UnlockDiagnosticVMOption参数。