问题已经解决,把常用命令在这里记一下,省得每次去查。
1、top
使用top查找到负载较高的进程,第一个就是。
如图,查找到的PID为:31749
小技巧:打开top后,键入小写c出现应用名,键入大写P按CPU排序,键入大写M按内存排序
2、jstack 31749 > stack.txt
生成Java线程栈信息到文件stack.txt,其实可以在线看的,但是为了便于分析还是下载到本地(命令:sz -y stack.txt)
3、top -H -p 31749
查看31749进程下占用Cpu较高的线程
可以查到线程ID为31789、31816、31840、31859
我们把从十进制转为十六进制,任取一个网站(如:http://tool.oschina.net/hexconvert/)
对应的十六进制为:7c2d、7c48、7c60、7c73
4、打开之前保存的stack.txt文件,搜索上述四个线程ID,查看可能的问题
5、jmap -heap 31749
因为之前查找到的问题是GC的问题,所以还查了堆的一些情况
堆的情况一目了然,熟悉JVM的同学看到这里估计一种见到亲人的感觉
6、jmap -dump:format=b,file=heap.bin 31749
下载堆的快照到文件heap.bin,使用sz -y heap.bin保存到本地
7、在本地执行(需安装Java并配置环境变量) jhat heap.bin
执行成功后,会告诉你一个端口,这里是7000,即访问地址:localhost:7000
jhat还可以打开两个转储文件做对比:jhat -baseline heap1.bin heap2.bin 会显示两个堆之间的差值
8、访问localhost:7000
有两个分析较为重要,在页面最下:
1. Instance Counts for All Classes (excluding platform)
2. Heap Histogram
9、jmap -histo:live 31749 > histo.txt
这也是个很好用的命令,可以直接查看对象个数和大小
10、jstat -gc 31749
主要注意一下GC次数是否频繁
YGC :从应用程序启动到采样时年轻代中gc次数
FGC :从应用程序启动到采样时old代(全gc)gc次数