JAVA加密功能导致内存溢出(LinkedHashMap$Entry内存一直增加)

加密导致内存溢出(LinkedHashMap$Entry内存一直增加)

在这里插入图片描述
https://blog.csdn.net/MrLiar17/article/details/86748353
https://www.jianshu.com/p/b67bb91530b5
参照这两个链接,自己用jmap看了内存信息发现有很多BouncyCastleProvider这个对象。
按照链接里的修改代码
原代码:

public static String decrypt(String encryptStr, String decryptKey) throws Exception {
        //base64格式的key字符串转byte
        byte[] decodeBase64 = Base64.decodeBase64(encryptStr);

        //设置Cipher对象
        Cipher cipher = Cipher.getInstance(ALGORITHMS,new BouncyCastleProvider());
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), KEY_ALGORITHM));
        //调用doFinal解密
        byte[] decryptBytes = cipher.doFinal(decodeBase64);
        return new String(decryptBytes);
    }

修改后:

private static BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
public static String decrypt(String encryptStr, String decryptKey) throws Exception {
        //base64格式的key字符串转byte
        byte[] decodeBase64 = Base64.decodeBase64(encryptStr);

        //设置Cipher对象
//        Cipher cipher = Cipher.getInstance(ALGORITHMS,new BouncyCastleProvider());
        Cipher cipher = Cipher.getInstance(ALGORITHMS,bouncyCastleProvider);
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), KEY_ALGORITHM));
        //调用doFinal解密
        byte[] decryptBytes = cipher.doFinal(decodeBase64);
        return new String(decryptBytes);
    }

修改后内存正常,问题可以解决,但是我也不知道原理。
按照上述链接改成单例模式也是不起作用的,要用静态变量才可以。
链接里说:
“new BouncyCastleProvider() 是静态方法中的, new一个多一个,GC不回收, 慢慢就宕机。”
“可以看到因为verificationResults是静态的,不会被GC,所以随着加密工具类调用的次数增加,verificationResults存储的BouncyCastle也越来越多,最终导致OOM。”
这个说法正确吗?静态方法里不能new对象?
为什么单例模式不起作用?单例的实例和静态变量有什么不同?

https://blog.csdn.net/u013642886/article/details/90145154
这个链接里说的有道理,真正原因应该是这个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值