最近项目上使用到了一种加密方式叫PGP,提供的工具类里面有使用BouncyCastleProvider类。
JcePGPDataEncryptorBuilder c = new JcePGPDataEncryptorBuilder(PGPEncryptedData.DES)
.setWithIntegrityPacket(withIntegrityCheck)
.setSecureRandom(new SecureRandom())
.setProvider(new BouncyCastleProvider());
然后发现运行一段时间后内存溢出了,查看堆信息发现是JceSecurity的verificationResults这个map里面存了很多的BouncyCastleProvider对象。
经过查询资料得知:每次新建BouncyCastleProvider对象之后,会放在verificationResults这个map里面,这个map是IdentityHashMap,是根据==来判断key是否存在而不是使用equals方法,所以每次new了一个BouncyCastleProvider对象,map就会新增一个对象而不是替换。时间长了之后,没有释放旧的对象,自然就内存溢出了。
解决办法:既然原因是对象太多,那就避免太多的new BouncyCastleProvider()即可。一般的做法是给BouncyCastleProvider定义成单例就可以了。
private static BouncyCastleProvider bouncyCastleProvider = null;
public static synchronized BouncyCastleProvider getProviderInstance() {
if (bouncyCastleProvider == null) {
bouncyCastleProvider = new BouncyCastleProvider();
}
return bouncyCastleProvider;
}
后面问题没有再出现,完美。