1、查看垃圾回收器
运行
java -version
32位jvm分server和client,64位jvm只有server
查看gc日志
cms 是为了gc时减少停顿时间。cpu到100%
2、JDK自带的监控工具
JDK自带的 监控工具
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/toc.html
jmap -heap pid 堆使用情况
jstat -gcutil pid 1000
jstack 线程dump
jvisualvm
jconsole
MAT
http://help.eclipse.org/oxygen/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/administrator/james/error.hprof
怀疑:
1.看GC日志 126719K->126719K(126720K)
2.dump
3.MAT
1.占用Retained Heap
2.看有没有GC Root指向
jmap
jmap -heap 【jar ID】
先查deadlock,再blocked
下图对上图的解释
3、优化
什么条件触发STW的Full GC呢?
1、Perm空间不足;永久带不足
2、CMS GC时出现promotion failed和concurrent mode failure(concurrent mode failure发生的原因一般是CMS正在进行,但是由于老年代空间不足,需要尽快回收老年代里面的不再被使用的对象,这时停止所有的线程,同时终止CMS,直接进行Serial Old GC);
(promontion faild产生的原因是EDEN空间不足的情况下将EDEN与From survivor中的存活对象存入To survivor区时,To survivor区的空间不足,再次晋升到old gen区,而old gen区内存也不够的情况下产生了promontion faild从而导致full gc )
3、统计得到的Young GC晋升到老年代的平均大小大于老年代的剩余空间;
4、主动触发Full GC(执行jmap -histo:live [pid])来避免碎片问题。谨慎使用,卡死时用的。
解决思路: