JVM调试主要用于排查Java程序运行时出现的各类错误和异常,常见的调试工具有:
- jps:列出正在运行的Java进程,用于定位Java程序进程号。
- jstat:监视虚拟机各方面的运行数据,一般用于监控垃圾收集、内存等信息。
- jinfo:实时查看和调整虚拟机配置参数,一般用于监视或修改JVM配置。
- jmap:生成Java堆转储快照,一般用于检测Java堆的内存泄漏。
- jhat:分析jmap生成的堆转储快照,用于查找对象的引用链。
- jstack:生成当前的线程快照,用于检测死锁等线程运行状态。
- jconsole:图形界面跟踪JVM及应用程序的运行时状态,集成多种功能。
- VisualVM:强大的JVM监控与故障排除工具,集成多种功能于一身。
来看一个简单例子:
我们编写一个Java程序SomeJavaApp进行调试,启动命令:
java -Xmx512m SomeJavaApp
- jps查找进程号:
jps
输出:
4789 SomeJavaApp
- jstat监控堆内存使用情况:
jstat -gc 4789 1000
输出:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
512.0 512.0 0.0 512.0 512.0 64.0 819.2 560.3 96.0 76.7 0.0 0.0 4 0.196 0 0.000 0.196
- jinfo修改堆大小为1024m:
jinfo -flag Xmx1024m 4789
- jmap生成堆快照:
jmap -dump:format=b,file=heap.dump 4789
- jhat分析堆快照:
jhat heap.dump
启动jhat后,可以在http://localhost:7000访问,查看对象统计信息和引用链等。
- jstack打印线程信息:
jstack 4789
输出当前线程快照,用于检测死锁等线程问题。