Bouncy Castle内存溢出

时间:2024-10-27 00:05:50

现象:

堆内存溢出,java.lang.OutOfMemoryError: Java heap space
用jmap查看,显示
num     #instances         #bytes  class name
----------------------------------------------
   1:       6736096      269443840  java.util.LinkedHashMap$Entry
   2:       1360211      116788016  [C
   3:       3560635      113940320  java.util.Hashtable$Entry
   4:       1648844       92335264  java.security.Provider$Service
   5:       3181146       76347504  java.security.Provider$ServiceKey
   6:         21269       54483872  [Ljava.util.HashMap$Entry;
   7:       1456006       46592192  java.lang.String
   8:          5837       26712568  [Ljava.util.Hashtable$Entry;
   9:        722313       23248472  [Ljava.lang.Object;
  10:        142687       20602688 
  11:        142687       19416024 
  12:        718388       17241312  java.util.ArrayList
  13:         13487       14511200 
  14:         13487       10430624 
  15:         11194        8157360 
  16:        127989        7303936 
  17:         29127        3953880  [B
  18:         19410        3739704  [I
  19:         35613        3133944  java.lang.reflect.Method
  20:         69481        2223392  java.util.HashMap$Entry
  21:          2886        2137144 
  22:         14176        1474304  java.lang.Class
  23:         18304        1127368  [S
  24:         21231        1068624  [[I
  25:         12681         811584  com.ibatis.sqlmap.engine.mapping.parameter.ParameterMapping
  26:         12681         811584  com.ibatis.sqlmap.engine.mapping.parameter.ParameterMapping
  27:         11454         641424  java.util.LinkedHashMap
  28:          9802         627328  com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.SqlTag
  29:          9802         627328  com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements.SqlTag
  30:         20443         490632  com.ibatis.sqlmap.engine.mapping.sql.SqlText
  31:         20443         490632  com.ibatis.sqlmap.engine.mapping.sql.SqlText
  32:          9738         467424  java.util.HashMap
  33:          9231         443088  org.apache.catalina.loader.ResourceEntry
  34:         10718         428720  java.lang.ref.SoftReference
  35:         21067         416344  [Lcom.ibatis.sqlmap.engine.mapping.parameter.ParameterMapping;
  36:         21067         416344  [Lcom.ibatis.sqlmap.engine.mapping.parameter.ParameterMapping;
  37:         12940         414080  java.lang.ref.WeakReference
  38:         19937         413624  [Ljava.lang.Class;
  39:           660         385440 
  40:         10423         376192  [Ljava.lang.String;
解决方案:
/usr/local/java/jdk1.6.0_37/jre/lib/security/java.security 加上一行 security.provider.9=org.bouncycastle.jce.provider.BouncyCastleProvider
修改RSAUtil new org.bouncycastle.jce.provider.BouncyCastleProvider() -> "BC"
static{
    if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null){
        logger.info("security provider BC not found");
        Security.addProvider(new BouncyCastleProvider());
    }
}
部署:从WAR中移出bouncycastle的jar,移到/usr/local/java/jdk1.6.0_37/jre/lib/ext下面(不需要加静态导入),移到tomcat/lib下面(需要加静态导入)