PermGen space,permgenspace

來源:互聯網
上載者:User

PermGen space,permgenspace

【轉】http://blog.csdn.net/xiaojianpitt/article/details/3276790

PermGen space

PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存地區OutOfMemoryError: PermGen space從表面上看就是記憶體益出,解決方案也一定是加大記憶體。說說為什麼會記憶體益出:這一部分用於存放Class和Meta的資訊,Class在被 Load的時候被放入PermGen space地區,它和和存放Instance的Heap地區不同,GC(Garbage Collection)不會在主程式運行期對PermGen space進行清理,所以如果你的APP會LOAD很多CLASS的話,就很可能出現PermGen space錯誤。這種錯誤常見在web伺服器對JSP進行pre compile的時候。 如果你的WEB APP下都用了大量的第三方jar, 其大小 超過了jvm預設的大小(4M)那麼就會產生此錯誤資訊了。
解決方案: 手動設定MaxPermSize大小
改正方法:-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m

 

修改TOMCAT_HOME/bin/catalina.sh
JAVA_OPTS="-server -XX:PermSize=64M-XX:MaxPermSize=128m
建議:將相同的第三方jar檔案移置到tomcat/shared/lib目錄下,這樣可以達到減少jar 文檔重複佔用記憶體的目的。

Sun文檔是這樣解釋的:

java.lang.OutOfMemoryError: PermGen space

The detail message PermGen space indicates thatthe permanent generation is full.The permanent generation is the area of the heap where class and method objectsare stored. If an application loads a very large number of classes, then thesize of the permanent generation might need to be increased using the -XX:MaxPermSizeoption.

Interned java.lang.String objects are also storedin the permanent generation. The java.lang.String class maintains apool of strings. When the intern method is invoked, the method checksthe pool to see if an equal string is already in the pool. If there is, thenthe intern method returns it; otherwise it adds the string to thepool. In more precise terms, the java.lang.String.intern method isused to obtain the canonical representation of the string; the result is areference to the same class instance that would be returned if that stringappeared as a literal. If an application interns a huge number of strings, thepermanent generation might need to be increased from its default setting.

When this kind of error occurs, the text String.internor ClassLoader.defineClass might appear near the top of the stacktrace that is printed.

The jmap -permgen command prints statistics forthe objects in the permanent generation, including information aboutinternalized String instances. See 2.6.4Getting Information on the Permanent Generation.

下面是某人遇到的問題:

SUN JDK+Tomcat 5.5.20運行服務的時候遇到問題,伺服器跑幾天后就會掛掉,並報java.lang.OutOfMemoryError: PermGen space異常。

發現很多人把問題歸因於: spring,hibernate,tomcat,因為他們動態產生類,導致JVM中的permanentheap溢出 。然後解決方案眾說紛紜,有人說升級 tomcat版本到最新甚至乾脆不用tomcat。還有人懷疑spring的問題,在spring論壇上討論很激烈,因為spring在AOP時使用CBLIB會動態產生很多類。

但問題是為什麼這些王牌的開源會出現同一個問題呢,那麼是不是更基礎的原因呢?tomcat在Q&A很隱晦的回答了這一點。(Why does the memory usage increase when I redeploya web application? Because the Classloader(and the Class objects it loaded) cannot be recycled. They are stored in thepermanent heap generation by the JVM, and when you redepoy a new class loaderis created, which loads another copy of all these classes. This can cause OufOfMemoryErrorseventually. )

於是有人對更基礎的JVM做了檢查,發現了問題的關鍵。原來SUN 的JVM把記憶體分了不同的區,其中一個就是permanent區用來存放用得非常多的類和類描述。本來SUN設計的時候認為這個地區在JVM啟動的時候就固定了,但他沒有想到現在動態會用得這麼廣泛。而且這個地區有特殊的垃圾收回機制,現在的問題是動態載入類到這個地區後,gc根本沒辦法回收!

對這個bug最徹底的解決辦法就是不要用SUN的JDK,而改用BEA的JRokit.

 

在tomcat中redeploy時出現outofmemory的錯誤.

可以有以下幾個方面的原因:

1,使用了proxool,因為proxool內部包含了一個老版本的cglib.

2, log4j,最好不用,只用common-logging

3, 老版本的cglib,快點更新到最新版。

4,更新到最新的hibernate3.2
3、 這裡以tomcat環境為例,其它WEB伺服器如jboss,weblogic等是同一個道理。

 

二、java.lang.OutOfMemoryError:Java heap space
Heap size 設定
JVM堆的設定是指java程式運行過程中JVM可以調配使用的記憶體空間的設定.JVM在啟動的時候會自動化佈建Heap size的值,
其初始空間(即-Xms)是實體記憶體的1/64,最大空間(-Xmx)是實體記憶體的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等選項可
進行設定。Heap size的大小是YoungGeneration 和TenuredGeneraion 之和。
提示:在JVM中如果98%的時間是用於GC且可用的Heap size 不足2%的時候將拋出此異常資訊。
提示:Heap Size 最大不要超過可用實體記憶體的80%,一般的要將-Xms和-Xmx選項設定為相同,而-Xmn為1/4的-Xmx值。
解決方案:手動設定Heapsize
修改TOMCAT_HOME/bin/catalina.sh
在“echo"Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -Xms800m-Xmx800m  -XX:MaxNewSize=256m"

三、執行個體,以下給出1G記憶體環境下java jvm 的參數設定參考:

JAVA_OPTS="-server -Xms800m-Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m-XX:MaxPermSize=128m-Djava.awt.headless=true "


針對Tomcat,如果Tomcat下面有多個應用,儘可能的把lib下共用的jar檔案放到Tomcat的lib下,發布速度和運行速度上也有所提升。

 

題外話:經常看到網友抱怨tomcat的效能不如...,不穩定等,其實根據筆者幾年的經驗,從"互聯星空“到現在的房產門戶網,我們均使用tomcat作為WEB伺服器,每天訪問量百萬多,tomcat仍然運行良好。建議大家有問題多從自己程式入手,多看看java的DOC文檔。

參考文檔:http://blogs.sun.com/jonthecollector/entry/presenting_the_permanent_generation

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.