JceSecurity/BouncyCastleProvider导致JVM内存溢出、CPU过高问题排查

问题:用户量3千左右,并且业务没有对外开放,CPU一直居高不下。


分析:初步怀疑开发人员逻辑控制不严谨, 导致死循环,因为业务量不大,用户量不大,不可能出现高并发。

1.通过jstack查找出对应执行线程是Vm Thread 线程,初步怀疑是频繁的GC导致cpu过高。

2.查看堆栈信息 jmap -heap 16190,如下图:

JceSecurity/BouncyCastleProvider导致JVM内存溢出、CPU过高问题排查_第1张图片

看到年老区已使用86%

3.查看垃圾回收频率,再次确认:jstat -gcutil 16190 1000

JceSecurity/BouncyCastleProvider导致JVM内存溢出、CPU过高问题排查_第2张图片

FGC频率非常高,基本确定就是GC回收频繁,导致CPU过高。

4.确认问题代码,执行jmap -dump:format=b,file=heap.bin 16190,生成堆栈文件,通过MAT进行分析,如下图:


JceSecurity/BouncyCastleProvider导致JVM内存溢出、CPU过高问题排查_第3张图片


JceSecurity这个类就占用大部分内存,点击Dominator Tree进行分析,如下图:


JceSecurity/BouncyCastleProvider导致JVM内存溢出、CPU过高问题排查_第4张图片

由于IdentityHashMap存放过多BouncyCastleProvider这个类,占用了大部分内存,查看JceSecurity中的IdentityHashMap,如下图:



JceSecurity/BouncyCastleProvider导致JVM内存溢出、CPU过高问题排查_第5张图片

现在已经确定是由于map是static修饰导致,导致存放的类不能被jvm回收导致

5、查找程序中使用BouncyCastleProvider的代码,跟开发人员确认是解密类,如下图:


JceSecurity/BouncyCastleProvider导致JVM内存溢出、CPU过高问题排查_第6张图片


JceSecurity/BouncyCastleProvider导致JVM内存溢出、CPU过高问题排查_第7张图片

JceSecurity/BouncyCastleProvider导致JVM内存溢出、CPU过高问题排查_第8张图片


6、修改RSAUtil类中BouncyCastleProvider为单例,在此进行压测观察,如下图:

JceSecurity/BouncyCastleProvider导致JVM内存溢出、CPU过高问题排查_第9张图片

压测进行2小时,GC回收频率如下图:

JceSecurity/BouncyCastleProvider导致JVM内存溢出、CPU过高问题排查_第10张图片


  内存使用情况:


JceSecurity/BouncyCastleProvider导致JVM内存溢出、CPU过高问题排查_第11张图片

JceSecurity/BouncyCastleProvider导致JVM内存溢出、CPU过高问题排查_第12张图片

你可能感兴趣的:(jvm)