JVM调试命令

参数类型

标准参数

-help,-version

X参数

-Xint 解释执行
第一次本地执行
-Xmixed 混合模式

XX参数

-XX:+PrintFlagsInitial 查看JVM的初始化参数
-XX:+PrintFlagsFinal 查看JVM的运行参数

JVM参数有很多,只需要记住一些关键的即可。平时多积累知道有哪些参数就可以。忘记的话直接使用-help即可。也可以查看官网Java命令官网说明

也可以使用java -XX:+PrintFlagsFinal pid 对常用命令进行总结

常用命令

jps [-ll]

查看运行中的java进程,快速找到需要的java进程id
-ll 查看详细的class名

jinfo

查看java的信息

image

命令比较简单,主要查看某些命令的配置参数
jinfo -flags [pid] 可查看一些基础命令

jstat 查看JVM的统计信息

jstat -<option> [-t] [-h] [<interval> [<count>]]

  • option:参数
  • -t:添加一个时间戳参数
  • -h:指定多少行输出一次表头
  • interval:执行每次的间隔时间,单位为毫秒
  • count: 用于指定输出多少次记录,缺省则会一直打印

option的参数有很多

  • -class 显示ClassLoad的相关信息;
  • -compiler 显示JIT编译的相关信息;
  • -gc 显示和gc相关的堆信息;
  • -gccapacity 显示各个代的容量以及使用情况;
  • -gcmetacapacity 显示metaspace的大小
  • -gcnew 显示新生代信息;
  • -gcnewcapacity 显示新生代大小和使用情况;
  • -gcold 显示老年代和永久代的信息;
  • -gcoldcapacity 显示老年代的大小;
  • -gcutil 显示垃圾收集信息;
  • -gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因;
  • -printcompilation 输出JIT编译的方法信息;

重点说一下-gc

image

执行以上命令就可以查看gc相关的堆信息,我写的每秒刷新一次。一共10次

  • S0C、S2C、S0U、S1U:S0和S1的总量和使用量
  • EC、EU:Eden区的总量和使用量
  • OC、OU:Old区的总量和使用量
  • MC、MU:Metaspace区的总量和使用量
  • CCSC、CCSU:压缩类控件总量和使用量
  • YGC、YGCT:YoungGC的次数和时间
  • FGC、FGCT:FullGC的次数和时间
  • GCT:总的GC时间

也可以在项目中加入XX参数,当出现gc时,自动写入日志,注意日志的文件夹必须提前创建。

1
2
3
4
5
6
-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径

jmap

jmap主要用于查看JVM内存信息。主要还可以到处dump文件。利用MAT来分析内存溢出

1
jmap -dump:format=b,file=help.hprof 9480

也可以在项目中加入XX参数。在项目出现内存溢出时,自动导出dump。

1
2
-XX:+HelpDumpOnOutOfMemoryError
-XX:HelpDumpPath=./

jstack

jstack 主要是用于打印线程,检查死锁和死循环
jstack [pid] 如果程序中存在死锁和死循环。最后一行一般是可以看到的。

实际中可以使用 jstack [pid] > aaa.txt 将其输出到文件中再仔细研究问题。也可以的

  • NEW 线程还没有启动
  • RUNNALE 准备启动
  • BLACKED 等待锁中获取,以执行
  • WAITING 等待中
  • TIMED WAITING 等待中
  • TERMINATED 退出

远程监控

jvisualVM 监控java进程

远程监控时需要添加以下参数

1
2
3
4
5
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9099
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=127.0.0.1