一、jps
jps主要用于获取Java虚拟机的进程号
,可配合以下参数使用:
-l
:输出main函数所在的主类全名,如果执行的是jar包,则输出jar包的路径;
-m
:输出jvm进程启动时传递给主类main函数的参数;
-v
:输出jvm进程启动时所传的配置参数;
二、jinfo
- 查看虚拟机启动时的配置参数,与
jps -v
相比,可以看到更多内容:例如通过参数-sysprops
看到System.getProperties()
可以获取到的JVM属性参数,或者未被显式指定的jvm参数系统默认值。 - 在运行时修改jvm参数,格式如下:
-flag name=value
。 - jvm启动过程中jar包加载情况等,详见博客JVM进程jar包加载分析。
三、jstat
主要统计或监控jvm运行状态信息,例如类装载、jvm内存结构占用、jvm垃圾收集等信息,可配合以下参数使用:
-class
:统计类装载及卸载数量、空间使用量、耗时等;
-gcutil
:监视Java堆使用占比
,例如Eden区、两个Survivor区、老年代、永久代的使用占比,以及相应堆区间垃圾收集次数及占用时间。
-gccause
:与-gcutil
一样,但是会输出上一次垃圾回收的原因。
-gc
:监控内容基本和-gcutil
参数类似,不过这里不是占比
而是使用量大小
;
-gccapacity
:查看新生代、老年代、永久代的存储容量;
-gcnew
:查看新生代垃圾收集情况;
-gcnewcapacity
:用来查看新生代存储容量情况;
同新生代对应,查看老年代以及永久代使用情况也有相应的参数-gcold
、-gcoldcapacity
、-gcpermcapacity
。
四、jstack
主要用于查看线程运行时的方法调用堆栈信息,可以快速定位线程出现长时间停顿的原因,例如线程间死锁、死循环、请求外部资源、信号量没有释放、执行耗时的操作等。该命令可配合如下参数使用:
-F
:当线程没有响应时,强制输出线程堆栈
;
-l
:除堆栈外,显示关于锁的附加信息;
-m
:如果调用到本地方法的话,可以显示C/C++的堆栈;
五、jmap
主要用于:
1. 生成对的转储快照:
-dump
:生成Java堆转储快照;
-F
:当虚拟机进程对-dump
选项没有响应时,强制生成dump快照;
通过虚拟机参数
-XX:+HeapDumpOnOutOfMemoryError
参数,可以让虚拟机在OOM异常出现时自动生成dump文件;或者通过虚拟机参数-HeapDumpOnCtrlBreak
,使用Ctrl+Break键让虚拟机生成dump文件。
转储快照示例:
jmap -F -dump:format=b,file=/your_path/heap.bin 19220
2. 查看堆的概要信息
查看诸如GC使用的哪种垃圾收集器、堆空间的使用情况、JVM参数指定的各个内存空间的大小等,可配合如下参数:
-heap
:显示堆详细信息,如使用哪种回收器、参数配置、分代状况等。
-histo
:显示堆中对象统计信息,包括类、实例数量、合计容量等;
-finalizerinfo
:显示在F-Queue中等待Finalizer线程执行finalize方法的对象。