一、Jmap
jmap [option] pid
(一) 参数
-dump:[live,]format=b,file=
使用hprof二进制形式,输出jvm的heap内容到file参数指定的文件。 live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.-finalizerinfo
打印正等候回收的对象的信息.-heap
打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.-histo[:live]
打印每个class的实例数目,内存占用,类全名信息。VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.-clstats
打印classloader的信息。包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.
(二) 实例
1、 查看对象实例统计数据
jmap -histo pid 或者 jmap -histo:live pid
2、 查看系统ClassLoader信息
jmap -clstats pid
3、 获取当前堆快照
jmap -dump:format=b,file=heap.hprof pid
(三) 注意
jmap -dump
这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用。jmap -clstats
这个命令执行,JVM会去统计classloader信息,这整个过程也会比较的耗时,并且同样也会暂停应用jmap -histo:live
这个命令执行,JVM会先触发gc,然后再统计信息。
二、Jstack
jstack [option] pid
(一) 参数
-F 强制打印堆栈
-m 打印java 和 native(C++) 堆栈信息
-l 打印额外的信息,包括锁信息
(二) 案例
1、获取某个线程的堆栈信息
jstack pid > jstack.txt
2、定位消耗CPU最多的线程
https://mp.weixin.qq.com/s/c-KuGjI_VH1dTxIWtxZJEg
3、IBM工具使用分析线程堆栈信息
https://www.ibm.com/developerworks/cn/java/j-java8idioms1/index.html
(三) 注意
- 使用jstack打印堆栈的时候,会中断服务,导致短时间类服务不可用
三、Jstat
jstat -<option> <vmid> [<interval> [<count>]]
jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]
(一) 参数
-
option 选项
-class: 类加载器的统计信息
-compiler: JIT编译的统计信息
-gc: 垃圾回收统计
-gccapacity: 堆内存统计
-gccause: 产生GC的原因
-gcnew: 新生代垃圾回收统计
-gcnewcapacity: 新生代内存统计
-gcold: 老年代垃圾回收统计
-gcoldcapacity: 老年代内存统计
-gcmetacapacity: 元数据空间统计
-gcutil: 垃圾收集统计信息
-printcompilation: JVM编译方法统计
-t 参数可以在输出信息前加上一列timestamp,表示程序运行的时间
-h 参数可以指定周期性数据输出时,输出多少行数据后,输出一个表头信息
interval 参数用户指定输出统计数据的周期,单位为毫秒
count 参数用户指定一共输出多少次数据
(二) 案例
(三) 推荐
http://lovestblog.cn/blog/2016/07/20/jstat/
参数
-XX:+HeapDumpOnOutOfMemoryError 虚拟机出现OOM的时候自动生成dump文件
推荐参数
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/log/gclog/
-Xloggc:/data/log/gclog/gc.log
Shell命令
1、查看进程执行的时间
ps -p pid -o etime
2、查看java线程
ps -ef | grep java | grep -v "grep"
3、获取消耗CPU最多的线程
top -Hp pid
扩展
命令帮助中出现的[] <>含义
在查看命令帮助时,会出现[],<>,|等符号,它们的含义如下:
[] 表示是可选的;
<> 表示是可变化的;
x|y|z 表示只能选择一个;
-abc 表示三个参数(或任何二个)的混合使用