虚拟机研究系列-了解JVM工具指令

jps(Java process status)

jps -l 全限定名以及jar包全限定名称

jps -lv 包含虚拟机参数以及包全限定名

jps -v 包含虚拟机进程参数

jps -m 包含程序入口参数


jstat(Java Virtual Machine statistics monitoring tool)

-class 显示ClassLoad的相关信息;

-compiler 显示JIT编译的相关信息;

-gc 显示和gc相关的堆信息;

-gccapacity    显示各个代的容量以及使用情况;

-gcmetacapacity 显示metaspace的大小

-gcnew 显示新生代信息;

-gcnewcapacity 显示新生代大小和使用情况;

-gcold 显示老年代和永久代的信息;

-gcoldcapacity 显示老年代的大小;

-gcutil 显示垃圾收集信息;

-gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因;

-printcompilation 输出JIT编译的方法信息;


jmap

jmap -dump:[live],format=b, file=filename

  • 此命令为导出dump hropf堆内存文件,记录heap dump文件信息,
  • live标识只导出live活跃的object信息,file标识为导出文件目录名称+文件名称

jmap -finalizerinfo

  • 导出那些等待GC且为执行finalize对象的方法

jmap -heap

  • 打印堆内存的使用量以及先关配置、新生区的使用量以及常量池字符串

**jmap -histo[:子参数]

  • 统计java堆中的对象信息,子参数只有一个live(作用同-dump的字参数live)。
  • -permstat 显示永久代的状态。

-F Use with -dump or -histo to force a heap dump or histogram when pid does not respond. The "live" suboption is not supported in this mode.**

jhat

jhat(java Heap Analysis Tool):java堆(快照)分析工具

说明:

1) jhat通常与jmap一起使用,使用jhat来分析jmap生成的堆快照。

2) jhat内置了一个微型的HTTP/HTML服务器,使用jhat对heap dump进行分析后,可以在浏览器中查看分析的结果,查看地址:http://localhost:7000/

3) 我们一般会使用一些更加高级的工具(VisualVM、Eclipse Memory Analyzer)来分析heap dump,而不是使用jhat来分析heap dump。

格式:jhat /data/test/heapDump.bin

VisualVM 查看dump文件:

1)在jdk的安装目录下找到 bin/jvisualvm 命令,启动VisualVM

2)将dump文件的后缀修改为.hprof 说明:mac下,第3步只能选择.hprof后缀的dump文件。

3)文件 --> 装入 --> 在弹出的窗口中 [文件格式:] 选择 [堆 Dump (hprof)] 后,选中dump文件即可

jstack(java堆栈跟踪工具)

生成当前时刻的线程快照(线程快照被称为thread dump或javacore文件)

格式:jstack [option] PID

可选项:

-F 强制到处生成dump文件

-m to print both java and native frames (mixed mode)

-l long listing. Prints additional information about locks

-h 输出帮助信息

应用:排查线程出现长时间停顿的原因

1) 线程出现长时间停顿的常见场景:

1>死循环

2>线程间发生了死锁

3>请求外部资源导致的长时间等待

2)常用命令:

1> 转储堆栈信息:jstack PID > /data/test/threadDumpFile

2> 统计所有的线程分别处于什么状态jstack PID | grep java.lang.Thread.State | awk '{print 35}' | sort | uniq -c

注意:

1) dump出来的线程ID(nid的值就是线程ID)是十六进制的,而我们用TOP命令看到的线程ID是十进制的。

注:使用printf命令将十进制的ID转换为十六进制的ID:printf "%x\n" 十进制的ID

2)用十六进制的ID去dump里找到对应的线程。

JCMD

jdk工具--jcmd

说明:jcmd用于向正在运行的JVM发送诊断信息请求(since JDK1.7),功能与jstack类似。

jcmd -l

列出当前所有运行的java进程,与jps命令的作用一样。

jcmd PID help

查看能从目标进程中获取到的信息

jcmd PID help GC.run

查看目标进程GC.run命令的说明

jcmd PID GC.run

调用java.lang.System.gc()方法

jcmd PID VM.version

查看JVM的版本信息

jcmd PID VM.system_properties

查看JVM的系统属性

举例:

进程启动命令中的java命令的安装路径,并不是 ${JAVA_HOME} 的值!代码中可通过System.getProperty("java.home")获取改值。

java.home=xxxx

jcmd PID VM.flags

查看JVM的参数

jcmd PID GC.class_histogram

查看JVM的类信息:每个类的实例数量和占用空间大小

jcmd PID Thread.print

查看JVM的Thread Dump

jcmd PID GC.heap_dump 转储文件的名称

查看JVM的Heap Dump

应用:分析内存泄露

1)先后执行两次Heap Dump和Thread Dump,在两次执行之间,执行一次GC。

2)如果在执行GC之后,还存在大对象,则该对象很可能是导致内存泄露的对象。

3)如果在执行GC之后,还有线程仍然在执行,则该线程很可能是导致内存泄露的线程。

你可能感兴趣的:(虚拟机研究系列-了解JVM工具指令)