BouncyCastleProvider 内存泄露 OOM

提要

每次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");

你可能感兴趣的:(java)