如何进行JVM调试?有哪些调试工具?代码举例讲解

JVM调试主要用于排查Java程序运行时出现的各类错误和异常,常见的调试工具有:

  1. jps:列出正在运行的Java进程,用于定位Java程序进程号。
  2. jstat:监视虚拟机各方面的运行数据,一般用于监控垃圾收集、内存等信息。
  3. jinfo:实时查看和调整虚拟机配置参数,一般用于监视或修改JVM配置。
  4. jmap:生成Java堆转储快照,一般用于检测Java堆的内存泄漏。
  5. jhat:分析jmap生成的堆转储快照,用于查找对象的引用链。
  6. jstack:生成当前的线程快照,用于检测死锁等线程运行状态。
  7. jconsole:图形界面跟踪JVM及应用程序的运行时状态,集成多种功能。
  8. VisualVM:强大的JVM监控与故障排除工具,集成多种功能于一身。

来看一个简单例子:
我们编写一个Java程序SomeJavaApp进行调试,启动命令:

java -Xmx512m SomeJavaApp
  1. jps查找进程号:
jps

输出:

4789 SomeJavaApp
  1. 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
  1. jinfo修改堆大小为1024m:
jinfo -flag Xmx1024m 4789
  1. jmap生成堆快照:
jmap -dump:format=b,file=heap.dump 4789
  1. jhat分析堆快照:
jhat heap.dump

启动jhat后,可以在http://localhost:7000访问,查看对象统计信息和引用链等。

  1. jstack打印线程信息:
jstack 4789

输出当前线程快照,用于检测死锁等线程问题。