2016年7月20日星期三

Java_029:JDK 自带小工具介绍之六:jcmd

环境:MAC OS X 10.11.5 + Oracle JDK 1.7.0_80

JDK 7 以后,多了 jcmd 这个小工具,它的功能很多,可以导出 Heap Dump,导出 Thread Dump,查看 java 进程,最重要的是可以执行 GC
在分析内存泄露时,可以先后执行两次 Heap Dump 和 Thread Dump,在两次执行之间,可以执行一次 GC。
如果在执行 GC 后,还依旧存在的大对象,将作为重点内存泄露对象;还依旧执行的线程,将作为重点怀疑对象。

1. 列出当前所有运行的 java 进程:jcmd -l

2. 列出当前运行的 java 进程可以执行的操作:jcmd PID help
比如:jcmd 17249 help
17249:
The following commands are available:
VM.native_memory
VM.commercial_features
GC.rotate_log
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
Thread.print
GC.class_histogram
GC.heap_dump
GC.run_finalization
GC.run
VM.uptime
VM.flags
VM.system_properties
VM.command_line
VM.version
help

3. 查看 JVM 的启动时长:jcmd PID VM.uptime
 
4. 查看 JVM 的类信息:jcmd PID  GC.class_histogram
这个可以查看每个类的实例数量和占用空间大小。

5. 查看 JVM 的Thread Dump:jcmd PID Thread.print

6. 查看 JVM 的Heap Dump:jcmd PID GC.heap_dump FILE_NAME
注意,如果只指定文件名,默认会生成在启动 JVM 的目录里。

7. 查看 JVM 的属性信息:jcmd PID VM.system_properties

8. 查看 JVM 的启动参数:jcmd PID VM.flags
注意,可以看到 -X 和 -XX 的参数信息,比较有用。

9. 查看 JVM 的启动命令行:jcmd PID VM.command_line

10. 对 JVM 执行 java.lang.System.runFinalization():jcmd PID GC.run_finalization
尽量去调用这个对象的finalize方法

11. 对 JVM 执行 java.lang.System.gc():jcmd PID GC.run
告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的。


12. 查看 JVM 的性能:jcmd PID PerfCounter.print

参考文献:
1. http://blog.csdn.net/winwill2012/article/details/46364849

没有评论: