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

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


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

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

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


看到年老区已使用86%

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


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

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




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



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




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

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







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


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



  内存使用情况:




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值