亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

JVM java.lang.OutOfMemoryError: PermGen space處理方法

2024-06-28 16:04:01
字體:
來源:轉載
供稿:網友
   近期weblogic 11g永久代內存溢出,分析JVM dump文件是沒有用處的,因為那只是堆內存,永久代不在里面。目前永久代設置是1G,遙想當年,只有400M,這么多年來一直在漲,現在一次full gc需要10多秒??梢栽龃蟮?.5G,但從GC日志中可以看到永久代在不斷的增長,如果二周不重啟weblogic,內存又不夠用了,不是長久之計。java.lang.OutOfMemoryError: PermGen spaceat java.lang.Class.getDeclaredMethods0(Native Method) ~[na:1.6.0_30]at java.lang.Class.PRivateGetDeclaredMethods(Class.java:2427) ~[na:1.6.0_30]at java.lang.Class.getDeclaredMethod(Class.java:1935) ~[na:1.6.0_30]at java.io.ObjectStreamClass.getPrivateMethod(ObjectStreamClass.java:1382) ~[na:1.6.0_30]at java.io.ObjectStreamClass.access$1700(ObjectStreamClass.java:52) ~[na:1.6.0_30]at java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:438) ~[na:1.6.0_30]at java.security.AccessController.doPrivileged(Native Method) ~[na:1.6.0_30]可以看到是方法區有問題,創建了大量的類,從GC日志上看,啟動之后永久代有700M,隨著時間的推移,會緩慢增長,這就是內存泄露,堆內存泄露也是這樣。如何定位哪些類一直在漲呢,此時就用到兩個重要的JVM參數,一個顯示每個加載的類,一個顯示每個卸載的類:-XX:+TraceClassLoading  -XX:+TraceClassUnloadingweblogic里面會出現這種日志,需要自己寫程序解析最后還有哪些類存活著。[Loaded MM.statistics.mmbillstatistics.exception.MmBillStatisticalTypeException from file:/data/Domain/mm_Domain/servers/mmServer1/stage/EAR/EAR/APP-INF/classes/mm/statistics/mmbillstatistics/exception/MmBillStatisticalTypeException.class][Loaded MM.statistics.mmbillstatistics.appservice.impl.MmBillStatisticalTypeSes_1k61gv_IMmBillStatisticalTypeServiceImpl_1035_WLStub from file:/data/wls1035/modules/com.bea.core.utils.wrapper_1.4.0.0.jar][Loaded MM.statistics.amfmHuiXuFinance.appservice.AmfmHuiXuFinanceBizService_f879n8_IAmfmHuiXuFinanceBizServiceRIntf from file:/data/Domain/mm_Domain/servers/mmServer1/cache/EJBCompilerCache/1nhs7towub2hs/mm/statistics/amfmHuiXuFinance/appservice/AmfmHuiXuFinanceBizService_f879n8_IAmfmHuiXuFinanceBizServiceRIntf.class][Loaded MM.statistics.amfmHuiXuFinance.exception.AmfmHuiXuFinanceException from file:/data/Domain/mm_Domain/servers/mmServer1/stage/EAR/EAR/APP-INF/classes/mm/statistics/amfmHuiXuFinance/exception/AmfmHuiXuFinanceException.class][Unloading class mm.purchase.purchaSEOrder.model.PurchaseItemVO][Unloading class mm.inventory.reservereplenishplan.appservice.impl.ReserveReplenishPlanBizService][Unloading class mm.inventory.reservequota.dao.ReserveQuotaBatchDAO]解析程序開始:drop table load_class purge;truncate table load_class;create table load_class(  nu number,  action varchar2(20),  class_name varchar2(1000),  class_file varchar2(1000));import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.InputStreamReader;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;/** * [Loaded java.lang.ClassNotFoundException from /usr/local/jdk1.6/jre/lib/rt.jar] * [Unloading class com.MM.externalinterface.fmis.impl.FmisBizService] * */public class PermAla {    static final String driver_class  = "Oracle.jdbc.driver.OracleDriver";    static final String connectionURL = "jdbc:oracle:thin:@10.10.15.164:1521:orcl";    static final String userID        = "SPROC";    static final String userPassWord  = "SPROC";    public static void readTxtFile(String filePath){        Connection  con = null;        String  s_sql = "insert into load_class values(?,?,?,?)";        PreparedStatement pstmt = null;        int i=0;        try {            Class.forName (driver_class).newInstance();            con = DriverManager.getConnection(connectionURL, userID, userPassword);            pstmt = con.prepareStatement(s_sql);            con.setAutoCommit(false);            String encoding="GBK";            File file=new File(filePath);            InputStreamReader read = new InputStreamReader(                    new FileInputStream(file),encoding);//考慮到編碼格式            BufferedReader bufferedReader = new BufferedReader(read);            String lineTxt = null;            String[] lineTxtArray= null;            while((lineTxt = bufferedReader.readLine()) != null){                if(lineTxt.indexOf("[Loaded")==0  ) {                    lineTxtArray = lineTxt.split(" ");                    pstmt.setInt(1, i);                    pstmt.setString(2, lineTxtArray[0]);                    pstmt.setString(3, lineTxtArray[1]);                    if(lineTxtArray.length ==4) {                        pstmt.setString(4, lineTxtArray[3]);                    }else{                        System.out.println(lineTxt);                    }                    pstmt.addBatch();                    i++;                } else if(lineTxt.indexOf("[Unloading")==0){                    lineTxtArray = lineTxt.split(" ");                    pstmt.setInt(1, i);                    pstmt.setString(2, lineTxtArray[0]);                    pstmt.setString(3, lineTxtArray[2]);                    pstmt.addBatch();                    i++;                }                if(i % 10000 == 0){                    pstmt.executeBatch();                    con.commit();                }            }            con.commit();            read.close();        } catch (Exception e) {            System.out.println("讀取文件內容出錯,行數:"+i);            e.printStackTrace();        }finally{            if(pstmt != null){                try {                    pstmt.close();                } catch (Exception e) {                    e.printStackTrace();                }finally{                    pstmt = null;                }            }            if(con != null){                try {                    con.close();                } catch (Exception e) {                    e.printStackTrace();                }finally{                    con = null;                }            }        }    }    public static void main(String argv[]){        String filePath = "E://永久代內存溢出//20161213//Server1.log";        readTxtFile(filePath);    }}--執行java代碼導入之后,處理一些特殊的格式update load_class   set action     = replace(action, '[', ''),       class_file = replace(class_file, ']', ''),       class_name = replace(class_name, ']', '');commit;update load_class   set class_name = replace(class_name, 'file:', ''),       class_file = replace(class_file, 'file:', '');commit;SQL> select * from load_class where rownum <10; NU ACTION  CLASS_NAME                               CLASS_FILE--- ------- --------------------------------------- -------------------------------- 96 Loaded  sun.misc.SharedSecrets                  /data/jdk1.6.0_45/jre/lib/rt.jar 97 Loaded  sun.misc.Unsafe                         /data/jdk1.6.0_45/jre/lib/rt.jar 98 Loaded  java.lang.IncompatibleClassChangeError  /data/jdk1.6.0_45/jre/lib/rt.jar 99 Loaded  java.lang.NoSuchMethodError             /data/jdk1.6.0_45/jre/lib/rt.jar100 Loaded  sun.reflect.Reflection                  /data/jdk1.6.0_45/jre/lib/rt.jar101 Loaded  java.util.Collections                   /data/jdk1.6.0_45/jre/lib/rt.jar102 Loaded  java.lang.Iterable                      /data/jdk1.6.0_45/jre/lib/rt.jar103 Loaded  java.util.Collection                    /data/jdk1.6.0_45/jre/lib/rt.jar104 Loaded  java.util.Set                           /data/jdk1.6.0_45/jre/lib/rt.jar       --顯示加載且沒有卸載的類 drop table  purge;create table  aswith res as(select count(*) over(partition by action,class_name order by nu asc) rn,               t.*          from load_class t),res1 as (select rn,class_name from res a where a.action='Loaded' minus select rn,class_name from res b where b.action='Unloading')select b.* from res1 a, res b where a.rn= b.rn and a.class_name= b.class_name;查看數據,對數據摸底                            select count(1) from  where class_file='__JVM_DefineClass__';select count(1) from  where class_file like       '/data/Domain/MMDomain/servers/MMServer1/stage/EAR/EAR/APP-INF/lib%';select count(1) from  where class_file like       '/data/Domain/MMDomain/servers/MMServer1/stage/EAR/EAR/APP-INF/classes%'      or class_file like '/data/Domain/MMDomain/servers/MMServer1/stage/EAR/EAR/ejb%';select count(1) from  where class_file like       '/data/wls1035/%';   select count(1) from  where class_file like       '/data/Domain/MMDomain/servers/MMServer1/cache/EJBCompilerCache/%'; select count(1) from  where class_file like       '/data/jdk1.6.0_45/jre%';         select count(1)  from  where class_file in ('weblogic.utils.classloaders.GenericClassLoader',        'sun.misc.Launcher$AppClassLoader',        'weblogic.utils.classloaders.ChangeAwareClassLoader','instance');select count(1) from  where class_file like       '/data/Domain/MMDomain/jsp_temp%';             

可以看到反射的類很多,重點研究__JVM_DefineClass__和sun.reflect.GeneratedMethodAccessor,發現是反射產生的一個問題。參考http://stackoverflow.com/questions/16130292/java-lang-outofmemoryerror-permgen-space-java-reflection

      When using Java reflection, the JVM has two methods of accessing the information on the class being reflected. It can use a JNI accessor, or a Java bytecode accessor. 

      If it uses a Java bytecode accessor, then it needs to have its own Java class and classloader (sun/reflect/GeneratedMethodAccessor class and sun/reflect/DelegatingClassLoader). Theses classes and classloaders use native memory. 

      The accessor bytecode can also get JIT compiled, which will increase the native memory use even more. 

      If Java reflection is used frequently, this can add up to a significant amount of native memory use. The JVM will use the JNI accessor first, then after some number of accesses on the same class, will change to use the Java bytecode accessor. This is called inflation, when the JVM changes from the JNI accessor to the bytecode accessor. Fortunately, we can control this with a Java property. 

      The sun.reflect.inflationThreshold property tells the JVM what number of times to use the JNI accessor. If it is set to 0, then the JNI accessors are always used. Since the bytecode accessors use more native memory than the JNI ones, if we are seeing a lot of Java reflection, we will want to use the JNI accessors. To do this, we just need to set the inflationThreshold property to zero.

如果節點使用sun公司jdk,配置-Dsun.reflect.inflationThreshold=2147483647 

如果是IBM的jdk,配置-Dsun.reflect.inflationThreshold=0

以下是配置的前后類數量對比,反射類有明顯的下降,從gc日志上看也有回收的跡象:

加載類的出處Server1server2
加參數前加參數后加參數前加參數后
__JVM_DefineClass__(反射產生的類)423723632199612822
EAR/APP-INF/lib25552231622361323579
EAR/APP-INF/classes21531156841516715176
wls103519017194201966119168
MMServer1/cache/EJBCompilerCache5996599659965996
/data/jdk1.6.0_45/jre3494349331753458
weblogic.utils.classloaders.GenericClassLoadersun.misc.Launcher$AppClassLoaderweblogic.utils.classloaders.ChangeAwareClassLoader2550257425082516
jsp_temp8431395843849
當然我遇到的情況是反射類引起的問題,如果你的永久代設置太小,不用糾結,直接把永久代內存加大;如果是類太多導致(不是反射類),那就想辦法瘦身,想辦法 改造去掉一些依賴的jar包,可能是一個大工程。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久视频免费观看| 国产色婷婷国产综合在线理论片a| 国产精品久久久久久久久久久久| 久久久久中文字幕2018| 精品久久久在线观看| 欧美成人午夜免费视在线看片| 国产欧美在线播放| 国产精品亚洲激情| 国内精品久久久久影院 日本资源| 亚洲精品视频在线播放| 国产精品一区久久| 欧美激情欧美激情| 疯狂做受xxxx欧美肥白少妇| 国产精品永久免费在线| 高清一区二区三区四区五区| 欧美日韩另类字幕中文| 国产精品亚洲视频在线观看| 国产人妖伪娘一区91| 国产精品第100页| 国产精品久久久久久久久影视| 精品国内自产拍在线观看| 91网站免费观看| 色婷婷av一区二区三区久久| 亚洲精品免费网站| 欧美成人性色生活仑片| 亚洲国产精品999| 黑人巨大精品欧美一区免费视频| 日韩有码视频在线| 欧美精品第一页在线播放| 久久全球大尺度高清视频| 欧美福利视频网站| 亚洲国产精品资源| 9.1国产丝袜在线观看| 色婷婷av一区二区三区在线观看| 欧美日韩美女视频| 国产精品日韩专区| 国产精品久久久久久久一区探花| 欧美成人激情视频| 青青草国产精品一区二区| 亚洲精品电影网在线观看| 8x海外华人永久免费日韩内陆视频| 国产日韩中文字幕在线| 亚洲理论片在线观看| 中文字幕在线精品| 日本久久精品视频| 欧美日韩国产成人高清视频| 欧美疯狂性受xxxxx另类| 亚洲综合第一页| 91久久精品久久国产性色也91| 国产成人中文字幕| 国产一区二区欧美日韩| 亚洲乱码av中文一区二区| 色老头一区二区三区在线观看| 亚洲国产精品大全| 欧美美女18p| 中文字幕日韩有码| 中文字幕亚洲综合久久筱田步美| 日韩av电影手机在线观看| 亚洲经典中文字幕| 九九热这里只有精品6| 国产有码在线一区二区视频| 欧美寡妇偷汉性猛交| 国内免费精品永久在线视频| 成人网在线免费看| 国产精品久久一区主播| 国产欧美一区二区白浆黑人| 91午夜理伦私人影院| 久久精品国产视频| 亚洲国产精品悠悠久久琪琪| 精品亚洲va在线va天堂资源站| 国产色婷婷国产综合在线理论片a| 97精品在线观看| 国产suv精品一区二区| 午夜精品国产精品大乳美女| 国产亚洲综合久久| 日韩美女在线看| 欧美激情视频网址| 伊人伊成久久人综合网小说| 日韩在线观看视频免费| 亚洲午夜久久久久久久| 成人有码在线视频| 国产深夜精品福利| 欧美限制级电影在线观看| 欧美在线免费看| 亚洲成人精品在线| 91视频国产一区| 青草热久免费精品视频| 日韩精品免费观看| 国产精品免费视频xxxx| 精品国产户外野外| 亚洲亚裔videos黑人hd| 久久中文精品视频| 亚洲乱码国产乱码精品精| 中文字幕欧美日韩精品| 欧美激情2020午夜免费观看| 国产精品老女人视频| 在线日韩欧美视频| 国产91色在线播放| 91欧美精品成人综合在线观看| 亚洲欧美福利视频| 国产精品成人免费电影| 91日本在线视频| 亚洲午夜激情免费视频| 久国内精品在线| 欧美另类老女人| 俺也去精品视频在线观看| 青青a在线精品免费观看| 高潮白浆女日韩av免费看| 成人免费视频网| 国产成人精品免高潮费视频| 成人国产精品免费视频| 成人网址在线观看| 中文字幕在线成人| 久久久久久久久久久国产| 国产精品a久久久久久| 91精品国产亚洲| 欧美与欧洲交xxxx免费观看| 国产欧美va欧美va香蕉在| 国产精品日本精品| 精品亚洲一区二区三区在线播放| 久久这里有精品视频| 日韩网站免费观看高清| 亚洲国产成人av在线| 日本中文字幕不卡免费| 中文日韩电影网站| 日韩精品极品视频免费观看| 欧美人与性动交| 亚洲国产精品人久久电影| 欧美亚洲第一页| 国内精品久久久久久| 亚洲a成v人在线观看| 亚洲一区二区三区777| 欧美午夜激情视频| 国产精品美女网站| 国产在线观看精品一区二区三区| 欧美激情综合色综合啪啪五月| 欧美孕妇毛茸茸xxxx| 91色精品视频在线| 91亚洲精品在线观看| 亚洲天堂成人在线| 中文字幕国产亚洲2019| 精品国产91久久久久久老师| 亚洲欧美另类国产| 色婷婷久久av| 成人欧美一区二区三区黑人| 亚洲在线观看视频网站| 中文字幕精品久久| 国产精品免费视频久久久| 成人免费看黄网站| 国产一区私人高清影院| 色综合久久久久久中文网| 日本精品久久久| 久久久久久网址| 欧美二区在线播放| 久久久久久九九九| 亚洲热线99精品视频| 欧洲成人免费视频| 成人乱色短篇合集| 91视频-88av| 欧美在线一区二区三区四| 中文字幕v亚洲ⅴv天堂| 国内免费精品永久在线视频| 精品无人国产偷自产在线| 亚洲第一中文字幕|