国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

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

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

2024-06-28 16:04:01
字體:
來源:轉載
供稿:網友
   近期weblogic 11g永久代內存溢出,分析JVM dump文件是沒有用處的,因為那只是堆內存,永久代不在里面。目前永久代設置是1G,遙想當年,只有400M,這么多年來一直在漲,現在一次full gc需要10多秒。可以增大到1.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包,可能是一個大工程。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产美女视频网站| 99热在线观看免费| 最新国产在线| 综合图区亚洲白拍在线 | yjizz视频网站在线播放| 天堂在线视频| 欧美色欧美亚洲另类二区精品| a级在线观看| 精品国产二区三区| eeuss影影院www在线播放| 免费视频二区| 国产午夜视频在线观看| 国产91久久久久| 久久久久国产精品嫩草影院| 轻轻色免费在线视频| 五月婷婷在线视频| 亚洲成人av在线影院| 国产免费专区| gogo在线高清视频| 精品剧情v国产在线观看| 青娱乐在线视频观看| 2018中文字幕在线观看| 日本免费视频www| 国产高清在线| 二区三区中文字幕| 亚洲精品aaaa| 国产a级网站| 中文字幕免费在线视频| 免费看ww视频网站入口| 国产xxx在线| 国产一级黄色片免费| 国产一卡2卡3卡四卡网站| 国产九九九九| www.狠狠艹| 亚洲精品一区中文字幕电影| 国产精品黄页网站在线播放免费| 久久精品国产亚洲777| 国产日本在线视频| 久草网在线视频| 日本高清不卡中文字幕| 中文在线观看视频| 在线午夜影院| 在线午夜视频| 国产激情视频一区二区三区| 久久久久久五月天久久久久久久久| 2021av天天| ·天天天天操| 国产二级片在线| 国产激情在线观看| 99在线视频观看| 在线激情小视频| av在线你懂的| 超碰在线影院| 成人日韩欧美| 最近最好的中文字幕2019免费 | 国产乱子伦三级在线播放| 超碰在线观看免费| 91麻豆福利| 亚洲图区综合| 黄色国产网站在线观看| 天堂中文在线视频| 国产精品蜜臀| 亚洲大香人伊一本线| 欧美96在线| 国产农村av| 99在线播放| 国内精品一区视频| 国产欧美久久久久久久久| 精品999视频| 黄污在线观看| 精品无人区乱码1区2区3区免费| 在线黄色av| 超碰国产在线观看| 精品国语对白精品自拍视| 超碰免费在线观看| 97在线免费| 黄网址在线永久免费观看| 国产羞羞视频在线观看| 亚洲精品国自产拍在线观看| 国产一区二区三区不卡在线| 四虎成人精品在永久在线观看| 国产中文字幕在线观看| 国产一卡二卡3卡4卡四卡在线| 国产欧美在线观看视频| 豆国产97在线|亚洲| 国产人成精品| 九色视频网站| 精品欧美不卡一区二区在线观看| а√资源新版在线天堂| 影音先锋在线中文字幕| 国产区高清在线| 国产一区二区影视| 丁香婷婷激情| 免费特级黄毛片| 亚洲伊人网在线观看| 国产精品乱码一区二区三区视频| 黄色av网站在线| 麻豆国产视频| jizz在线视频| 不卡av免费观看| 天天操夜夜添| 免费男女羞羞的视频网站中文字幕| 国产精品18久久久久久久久久| 国产中文字幕在线观看| 国内精品一区视频| 国产系列电影在线播放网址| 中文字幕在线播放网址| 天堂在线中文| 国产成人高清精品| 中文乱码字幕高清在线观看| 精品欧美不卡一区二区在线观看| 国产成人精品实拍在线| 99爱视频在线观看| 麻豆网站在线| 国产精品入口免费麻豆| 国产va在线观看| 亚洲精品影院在线| 尤物在线视频观看| 超碰免费在线播放| 国产亚洲精品久久久久久青梅| 国产二区视频在线观看| 亚洲精品久久久成人| 国产免费av高清在线| 国产区av在线| 热99re久久精品精品免费| 国产九色在线| 午夜在线观看91| 国产区高清在线| 免费女人毛片视频| 精品视频vs精品视频| 国产在线www| 精品国产丝袜高跟鞋 | 国产在线看片| 九七电影韩国女主播在线观看| 国产成人va亚洲电影| 尤物视频免费在线观看| 九九热在线视频| 国自产拍在线网站网址视频| 在线视频中文字幕久| 久蕉依人在线视频| av福利在线观看| 最近中文字幕在线中文视频| 四虎国产精品永久| 国产成人亚洲欧美电影| 国产一级在线观看| 久久精品蜜桃| 国产偷窥洗澡视频| 天天爱天天做色综合| 天天噜天天色| 在线免费观看黄色片| 国产区成人精品视频| 九色福利视频| 欧美国产中文| а√天堂www在线а√天堂视频| 精品精品导航| 国产福利在线观看| 国产馆av播放| 99reav| 精品久久av| 亚洲人av在线| www.五月色.com| 精品无人乱码| 99在线视频影院| eeuss在线观看| 波多野结衣中文字幕久久| 小说区乱图片区| 日本一本久久| 黄网址在线播放免费| 九色成人在线| 天天操人人干| 国产国产人免费人成免费视频| 国产精品伦一区二区三区视频 | 18成年在线观看| 中文字幕在线免费视频| 天天操天天操天天色天天要| 午夜在线小视频| 国产视频中文字幕| 精品视频在线一区二区| 天天草天天爽| 中文字幕高清av| av免费在线免费| 久久国产情侣| 国产成人精品久久一区二区小说| 在线a人片免费观看视频| 人日人天天爽| 国产欧美日韩第一页| 亚洲最新永久在线观看| 欧美性猛交xxxxbbbb| 午夜在线小视频| 在线āv视频| 午夜在线小视频| a视频在线观看| 国产精品视频一区二区免费不卡| 影音先锋中文字幕在线| 国产精品一区二区婷婷| 国产成人精品18| 中文字幕在线视频免费观看| 在线免费看黄网站| 国产一级黄色片免费| 日本黄在线观看|