提要
每次New一个BouncyCastleProvider导致的内存泄漏,原因为provider对象是JCE可以信任的JAR,并把缓存结果存起来,将把该种provider当key存入一个静态的MAP中缓存起来, 故到OLD区也未回收
错误使用方法
Cipher cipher = Cipher.getInstance("RSA", new BouncyCastleProvider());
解决方案
方法一
private static BouncyCastleProvider bouncyCastleProvider = null;
public static synchronized BouncyCastleProvider getInstance() {
if (bouncyCastleProvider == null) {
bouncyCastleProvider = new BouncyCastleProvider();
}
return bouncyCastleProvider;
}
......
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA", getInstance());
方法二
Provider provider=Security.getProvider(BouncyCastleProvider.PROVIDER_NAME);
if(provider==null){
provider=new BouncyCastleProvider();
Security.addProvider(provider);
}
Cipher cipher = Cipher.getInstance("RSA","BC");