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
3
5}' | 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之后,还有线程仍然在执行,则该线程很可能是导致内存泄露的线程。