前提
本笔记参照了周志明《深入理解Java虚拟机:JVM高级特性与最佳实践》
第三版,读完之后受益匪浅,让我对Java虚拟机有了一个深刻的认识,这也是Jvm书籍中最好的读物之一。
JDK命令行工具
在工作中需要监控运行在JDK1.5的虚拟机之上的程序,在程序启动时添加-Dcom.sun.management.jmxremote
开启JMX管理功能,JDK1.6以以上默认开启。
JDK的命令行工具
名称 | 主要作用 |
---|---|
jps | JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程 |
jstat | JVM Statistics Monitoribg Tool,用于手机HotSpot虚拟机各方面的运行数据 |
jinfo | Configuration Info for Java,显示虚拟机配置信息 |
jmap | Memory Map for Java,生成虚拟机的内存转储快照(heapdump文件) |
jhat | JVM Heap Dump Brower,用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果 |
jstack | Stack Trace for Java,显示虚拟机的线程快照 |
1. jps:虚拟机进程状况工具
- jps命令格式:
jps [option] [hostid]
- jps示例:
loubobooos-MacBook-Pro:~ loubobooo$ jps -l
12002
13380 sun.tools.jps.Jps
13335 org.jetbrains.jps.cmdline.Launcher
12104 com.install4j.runtime.launcher.MacLauncher
13114 org.jetbrains.idea.maven.server.RemoteMavenServer
13182 org.jetbrains.kotlin.daemon.KotlinCompileDaemon
- jps可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。
jps工具主要选项
选项 | 作用 |
---|---|
-q | 只输出LVMID,省略主类的名称 |
-m | 输出虚拟机进程启动时传递给主类main()函数的参数 |
-l | 输出主类的全名,如果进程执行的是Jar包,输出Jar路径 |
-v | 输出虚拟机进程启动时JVM参数 |
2. jstat:虚拟机统计信息监视工具
jstat命令格式为:
jstat [option vmid [interval[s|ms] [count]] ]
如果是本地虚拟机进程,VMID和LVMID是一致的,如果是远程虚拟机进程,那VMID的格式是:
[protocol:][//]lvmid[@hostname[:port]/servername\
参数interval和count代表查询间隔和次数。忽略两个参数,表示只查询一次。
示例命令:
jstat -gc 2764 250 20
jstat工具主要选项
选项 | 作用 |
---|---|
-class | 监视类装载、卸载数量、总空间以及类装载所消耗的时间 |
-gc | 监视Java堆状况,包括Eden区、两个survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息 |
-gccapacity | 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间 |
-gcutil | 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比 |
-gccause | 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因 |
-gcnew | 监视新生代GC状况 |
-gcnewcapacity | 监视内容与-gcnew相同,输出主要关注使用到的最大、最小空间 |
-gcold | 监视老年代GC状况 |
-gcoldcapacity | 监视内容与-gcold相同,输出主要关注使用到的最大、最小空间 |
-gcpermcapacity | 输出永久代使用到的最大、最小空间 |
-compiler | 输出JIT编译器编译过的方法、耗时等信息 |
-printcompilation | 输出已经被JIT编译的方法 |
3. jinfo:Java配置信息工具
- jinfo命令格式为:
jinfo [option] pid
- 示例命令:
jinfo -flag CMSInitiatingOccupancyFraction 1444
4. jmap:Java内存映像工具
- jmap命令格式为:
jmap [option] vmid
- 示例命令:
jmap -dump:format=b,file=eclipse.bin 3500
jmap工具主要选项
选项 | 作用 |
---|---|
-dump | 生成Java堆转储快照。格式为:-dump:[live, ]format=b,file=<filename>,其中live子参数说明是否只dump出存活的对象 |
-finalizerinfo | 显示在F-Queue中等待Finalizer县城执行finalize方法的对象。只在Linux/Solaris平台下有效 |
-heap | 显示Java堆详细信息,如使用哪种回收器、参数配置、分代状况等。只在Linux/Solaris平台下有效 |
-histo | 显示堆中对象统计信息,包括类、实例数量、合计容量 |
-permstat | 以ClassLoader为统计口径显示永久代内存状态。只在Linux/Solaris平台下有效 |
-F | 当虚拟机进程对-dump选项没有响应时,可使用这个选项强制生成dump快照。只在Linux/Solaris平台下有效 |
5. jhat:虚拟机堆转储快照分析工具
- 示例命令:
jhat eclipse.bin
6. jstack:Java堆栈跟踪工具
jstack命令用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机每一条线程正在执行的方法堆栈的集合。目的是定位线程出现长时间停顿的原因,如线程间思索、死循环、请求外部资源导致的长时间等待都是导致线程长时间停顿的常见原因。
- jstack命令格式为:
jstack [option] vmid
- 示例命令:
jstack -l 3500
jstack工具主要选项
选项 | 作用 |
---|---|
-F | 当正常输出的请求不被响应时,强制输出线程堆栈 |
-l | 除堆栈外,显示关于锁的附加信息 |
-m | 如果调用到本地方法的话,可以显示C/C++的堆栈 |
JDK的可视化工具
1. JConsole:Java监视与管理控制台
打开Terminal,输入jconsole
开启控制台。
2. JProfiler:Java内存分析工具
打开IDEA,查找插件JProfiler
本章小结
本章介绍了随JDK发布的6个命令行工具及两个可视化工具,灵活使用这些工具可以给问题处理带来极大的便利。