java的內存有不同類型,不同類型的內存溢出,處理方法不同,一定要看清是那種異常。通常會碰到內存溢出異常有下面兩種:
java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: Java heap space
PermGen space
PermGen space內存溢出最常見。全稱是Permanent Generation space,是指內存的永久保存區域。JDK8廢除了PermGen space,可以避免這種類型的內存溢出,也無需設置該項。碰到這種內存溢出建議升級到jdk8,或者設置Perm內存。
Jspxcms的內存設置建議值:
-XX:PermSize=128M:Perm內存最小值。
-XX:MaxPermSize=512M:Perm內存最大值。
Java heap space
Java heap space是堆內存溢出。碰到這種內存溢出,則需要加大堆內存。
Jspxcms的內存設置建議值:
-Xms512M:Heap內存最小值。
-Xmx1024M:Heap內存最大值。
Java內存類型
java內存的類型分為:堆(Heap)和非堆(Non-heap)內存。
堆(Heap)內存。用于存放運行時產生的數據,如運行時創建的對象、數組等數據。堆內存快被占滿時,會啟動垃圾回收,釋放內存空間。如果沒有設置Heap內存,默認是物理內存的1/4。現在內存條容量越來越大,堆內存溢出的情況相對較少。堆內存溢出時,出現的錯誤信息是:java.lang.OutOfMemoryError: Java heap space。
非堆(Non-heap)內存。就是PermGen。用于存放類的空間。默認是物理內存的1/64。java設計之初,各種程序規模相對較小,java類不多,并且運行時類的數量是固定的,所以該空間默認非常小,并且不進行垃圾回收。隨著java的急劇發展,各種類庫逐漸增多,java程序也變得越來越龐大,類的數量急速膨脹,默認非堆內存的空間越來越不夠用。特別是反射機制與動態代理技術的廣泛應用,程序可以在運行時創建類,使得PermGen內存溢出變得更為常見。非堆內存溢出時,出現的錯誤信息是:
java.lang.OutOfMemoryError: PermGen space。
Java的設計者們也看到了這個問題,在jdk8中廢除了PermGen,并且可以對存放類信息的空間進行垃圾回收。所以碰到java.lang.OutOfMemoryError: PermGen space異常,最好的辦法就是升級到jdk8。
內存設置
不同軟件、不同版本、不同情況下的設置方法各有不同。如eclipse的內存設置在eclipse目錄下的eclipse.ini文件。
tomcat6 解壓版 windows平臺
修改TOMCAT_HOME/bin/catalina.bat,在echo "Using CATALINA_BASE: $CATALINA_BASE"上面加入以下行:
set JAVA_OPTS=%JAVA_OPTS% -server -Xms512m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m
新聞熱點
疑難解答