JVM CPU打满问题定位

1.线程不释放,导致Old区占满,系统不停的FullGC

发现应用并没有在进行FGC,而是进行频繁的YGC。

YGC也存在异常,S1和S0区域都是从0直接跳到99%

观察堆大小装太发现Young区内存都是不断的从0到99,而Old区在慢慢递增,还未达到FGC的状态。但预计后续会不停的上涨,导致FGC频道,应用无法提供服务。

在发现YGC频繁之后大约3个小时,终于开始了频繁的FGC,Old区满。

以下是堆大小和FGC的情况:

可以看到差不多10秒钟Old区就用满了导致一次FGC,而且Old区大小是10G(多么恐怖,10个G十来秒就用完了)

 查完内存的状态确认并不是old区太小,被用满了导致了不停的FGC,因为old明显是够大的,如果10G不够,那应用肯定是有问题的。

查看进程的线程CPU使用情况:

top:查出较高的进程号

top -H -p 查出的进程号,显示出所有的线程!再按CPU排序,如下图

拿到CPU占用较高的几个线程,转成16进制

使用jstack看进程内的线程堆栈信息(jstack 24820 > abc.log)

vim编辑abc.log,查找上面获取到的线程的16进制数

如果有多个用户同时进行多个查询(一个用户也可以进行多次查询),就会出现多个线程多次SSH的情况。

2.多线程操作线程不安全变量

比如多线程操作HashMap

原文地址:https://www.cnblogs.com/zhulongchao/p/4731382.html