jvm排查工具
jps
jps -mvl --查看java的ps进程。
jstack
打印一个线程堆栈信息
top -H -p pid1 -> 得到占用资源大的pid2
jstack pid1 | grep "nid=0x printf "%x\n" pid2" -A 100打印后面100行(-C 打印前后100行 -B 打印前一百行)
jmap
jmap -dump:format=b,file=test.bin 4939 --tomcat pid
1.top看java进程的cpu和mem是否高。记录下java pid号
2.jstack -l 9547 > 9547.stack --将1得到java pid号堆栈dump下来。
3.top -H -p 9547 -- java pid 得到该进程下cpu高的pid号
4.printf 0x%x 9054 --将3得到的pid进行16进制。可以在2中dump下来的文件中找到相应的线程。
jmap -heap pid --查看内存
1.jmap -heap ${pid} (内存概述)
可查看当前内存配置
2.jmap -histo ${pid} (内存比对)
-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。如果连用SHELL jmap -histo pid>a.log可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。
3.jmap -dump (内存分析)
jmap -dump:format=b,file=outfile 3024可以将3024进程的内存heap输出出来到outfile文件里,再配合MAT(内存分析工具(Memory Analysis Tool),使用参见:http://blog.csdn.net/fenglibing/archive/2011/04/02/6298326.aspx)或与jhat (Java Heap Analysis Tool)一起使用,能够以图像的形式直观的展示当前内存是否有问题。
4.core dump开关
dump文件可以在程序crash的时候方便查看crash的上下文信息。
查看是否已打开
ulimit -c unlimited就可以了。只对当前对话有效
想长期有效:/etc/profile文件中找到 ulimit -S -c 0 > /dev/null 2>&1.ok 找到0改为unlimited,source /etc/profile使其生效。
core文件位置:默认与可执行程序同一目录下。文件名为core.<pid>
文件名模式保存在/proc/sys/kernel/core_pattern缺省是core
可通过以下命令修改core dump
echo PATH > /proc/sys/kernel/core_pattern