PermGen space

PermGen space php

PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域OutOfMemoryError: PermGen space從表面上看就是內存益出,解決方法也必定是加大內存。說說爲何會內存益出:這一部分用於存放ClassMeta的信息,Class在被 Load的時候被放入PermGen space區域,它和和存放InstanceHeap區域不一樣,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,因此若是你的APPLOAD不少CLASS的話,就極可能出現PermGen space錯誤。這種錯誤常見在web服務器對JSP進行pre compile的時候。 若是你的WEB APP下都用了大量的第三方jar, 其大小 超過了jvm默認的大小(4M)那麼就會產生此錯誤信息了。
解決方法: 手動設置MaxPermSize大小
改正方法:-Xms256m-Xmx256m-XX:MaxNewSize=256m-XX:MaxPermSize=256mhtml

 

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

java

Sun文檔是這樣解釋的:web

java.lang.OutOfMemoryError: PermGen spacespring

The detail message PermGen space indicates that the permanent generation is full. The permanent generation is the area of the heap where class and method objects are stored. If an application loads a very large number of classes, then the size of the permanent generation might need to be increased using the -XX:MaxPermSize option.tomcat

Interned java.lang.String objects are also stored in the permanent generation. The java.lang.String class maintains a pool of strings. When the intern method is invoked, the method checks the pool to see if an equal string is already in the pool. If there is, then the intern method returns it; otherwise it adds the string to the pool. In more precise terms, the java.lang.String.intern method is used to obtain the canonical representation of the string; the result is a reference to the same class instance that would be returned if that string appeared as a literal. If an application interns a huge number of strings, the permanent generation might need to be increased from its default setting.服務器

When this kind of error occurs, the text String.intern or ClassLoader.defineClass might appear near the top of the stack trace that is printed.app

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

下面是某人遇到的問題:jvm

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

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

但問題是爲何這些王牌的開源會出現同一個問題呢,那麼是否是更基礎的緣由呢?tomcatQ&A很隱晦的回答了這一點。(Why does the memory usage increase when I redeploy a web application? Because the Classloader (and the Class objects it loaded) cannot be recycled. They are stored in the permanent heap generation by the JVM, and when you redepoy a new class loader is created, which loads another copy of all these classes. This can cause OufOfMemoryErrors eventually.

因而有人對更基礎的JVM作了檢查,發現了問題的關鍵。原來SUN JVM把內存分了不一樣的區,其中一個就是permanent區用來存放用得很是多的類和類描述。原本SUN設計的時候認爲這個區域在JVM啓動的時候就固定了,但他沒有想到如今動態會用得這麼普遍。並且這個區域有特殊的垃圾收回機制,如今的問題是動態加載類到這個區域後,gc根本沒辦法回收!

對這個bug最完全的解決辦法就是不要用SUNJDK,而改用BEA JRokit.

 

tomcatredeploy時出現outofmemory的錯誤.

能夠有如下幾個方面的緣由:

,使用了proxool,由於proxool內部包含了一個老版本的cglib.

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

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

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

 

2、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 的大小是Young Generation Tenured Generaion 之和。
提示:在JVM中若是98%的時間是用於GC且可用的Heap size 不足2%的時候將拋出此異常信息。
提示:Heap Size 最大不要超過可用物理內存的80%,通常的要將-Xms-Xmx選項設置爲相同,而-Xmn1/4-Xmx值。
解決方法:手動設置Heap size
修改TOMCAT_HOME/bin/catalina.sh
「echo "Using CATALINA_BASE:   $CATALINA_BASE"」上面加入如下行:
JAVA_OPTS="-server -Xms800m-Xmx800m   -XX:MaxNewSize=256m"

3、實例,如下給出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文件放到Tomcatlib下,發佈速度和運行速度上也有所提高。

 

題外話:常常看到網友抱怨tomcat的性能不如...,不穩定等,其實根據筆者幾年的經驗,從"互聯星空到如今的房產門戶網,咱們 均使用tomcat做爲WEB服務器,天天訪問量百萬多,tomcat仍然運行良好。建議你們有問題多從本身程序入手,多看看javaDOC文檔。

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

相關文章
相關標籤/搜索