一个内存泄漏问题的排查

  1. 监控的MEM一直居高不下:

在这里插入图片描述

  1. 使用jstat命令查看gc的情况,发现YGC已经停止,一直在FGC,怀疑内存已经泄漏,堆内存中有大量无法回收的对象。

在这里插入图片描述

  1. 然后查看gc日志,发现年轻代和老年代使用率达到99%,且Full GC后内存没有被回收。确定肯定是有对象无法被回收。
    在这里插入图片描述
  2. 把堆的dump文件下载下来,用eclipse的mat插件分析error.hprof文件:
    在这里插入图片描述
    发现有个对象占用内存特别大:BouncyCastleProvider();
    在这里插入图片描述
    根据对象定位到项目代码,发现解密方法里用到了该对象:
/**
     * 需要解密的数据
     * 这是加解密的功能,每次运行加解密都会new一个BouncyCastleProvider对象,放倒Cipher.getInstance()方法中。
     * verificationResults.put(var0, PROVIDER_VERIFIED);
     * 导致内存被占用儿得不到了回收
     * @param data
     * @return
     * @throws Exception
     */
    public static String decrypt(String data) throws Exception {
        Cipher cipher = Cipher.getInstance("DES", new BouncyCastleProvider());
        return "a";
    }

依赖树已经提示了,往里面跟源码,发现verificationResults对象一直在put BouncyCastleProvider()对象,而没有remove,导致BouncyCastleProvider()对象越来越多,最后内存溢出。

final class JceSecurity {
   
    private static final Map<Provider, Object> verificationResults = new IdentityHashMap();
	//省略。。。。
static synchronized Exception getVerificationResult(Provider var0) {
        Object var1 = verificationResults.get(var0);
        if (var1 == PROVIDER_VERIFIED) {
            return null;
        } else if (var1 != null) {
            return (Exception)var1;
        } else if (verifyingProviders.get(var0) != null) {
            return new NoSuchProviderException("Recursion during verification");
        } else {
            Exception var3;
            try {
                verifyingProviders.put(var0, Boolean.FALSE);
                URL var2 = getCodeBase(var0.getClass());
                verifyProviderJar(var2);
                verificationResults.put(var0, PROVIDER_VERIFIED);
                var3 = null;
                return var3;
            } catch (Exception var7) {
                verificationResults.put(var0, var7);
                var3 = var7;
            } finally {
                verifyingProviders.remove(var0);
            }

            return var3;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值