1.jdk内置工具
内置工具包括了JDK中提供的常用监控工具以及故障排查工具。
监控工具:
jps
jstat 监控指定进程
jstat
故障排查工具:
jinfo
jmap
jstack
jcmd
jhat
jhsdb
可视化工具:
jhsdb
jconsole
VisualVM
Java Mission Control
2.操作
jps
jinfo
jinfo -sysprops [进程id] 只打印系统信息,不打印jvm参数了
jinfo -flags [进程id] 只打印jvm参数,不打印系统属性
jinfo -flag [ ] 打印指定参数的值
flag还有一个作用,就是查看没有展示出来的参数,比如我们查看线程栈的大小,刚才上一步没有展示出来
想查看JVM的参数,也可在启动时,指定-XX:+PrintFlagsFinal,这样会在启动时将JVM参数打印到日志。
jinfo也可以动态修改jvm参数,但是并非所有参数都支持动态修改,如果操作了不支持的修改参数,将会报类似如下的异常:
使用如下命令显示出来的参数,基本上都是支持动态修改的:
java -XX:+PrintFlagsInitial | grep manageable
如果是true和false: jinfo -flag +HeapDumpAfterFullGC 3396 +表示开 -表示关
如果是数字:使用key=value的形式 jinfo -flag MinHeapFreeRatio=60 3396
jmap: 展示对象内存的映射或堆内存的详细信息
jmap -clstats 3396 打印3396这个进程类加载的统计信息
jmap -finalizerinfo 3396 打印3396这个进程等待回收的对象的信息
jmap -histo 3396 打印指定进程里堆的直方图,也就是这个进程里指定的对象有多少个
jmap -histo:live 3396 打印指定进程里存活对象的直方图
dump:转储java堆,即把java堆里的对象作为快照存储到文件里,这个文件叫堆dump或堆转储文件。
jmap -dump:live,format=b,file=mydump.hprof 3396 只转储存活的对象
format=b 表示以hprof格式转储
要想获取Java堆Dump,除使用jmap外,还有以下方法:
使用-XX:+HeapDumpOnOutOfMemoryError,让虚拟机在OOM异常出现后自动生成堆Dump文件;使用-XX:+HeapDumpOnCtrlBreak,可使用[Ctrl]+[Break],让虚拟机生成堆Dump文件;
在Linux操作系统下,发送 kill -3 pid 命令;
对于Sring Boot应用,也可以使用Spring Boot Actuator提供的/actuator/heapdump实现堆Dump。