天天看點

java permgen space_PermGen space 與 Java heap space

1.java.lang.OutOfMemoryError: 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的時候。改正方法,在 run.bat 中加入:-Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m因為項目中引用了很多的 jar 包,而這些 jar 包中的 class 資訊會被 JBoss 的 class loader 加載到 PermGen space 區域,在 JVM 預設的情況下,該部分空間的大小隻有 4M,在 jar 包非常多的情況下,顯然是不夠用的,是以通過 -XX:MaxPermSize=256m 指定最大值後即可解決問題。另外,如果 heap 記憶體不足出現 java.lang.OutOfMemoryError: Java heap space 時,可以通過 -Xmx512m 指定最大 heap 記憶體來解決這樣的問題。

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 之和。提示:(1)在JVM中如果98%的時間是用于GC且可用的Heap size 不足2%的時候将抛出此異常資訊。(2)Heap Size 最大不要超過可用實體記憶體的80%,一般的要将-Xms和-Xmx選項設定為相同,而-Xmn為1/4的-Xmx值。

解決方法:手動設定Heap size,修改TOMCAT_HOME/bin/catalina.sh,在“echo "Using CATALINA_BASE:  $CATALINA_BASE"”上面加入以下行:JAVA_OPTS="-server -Xms800m -Xmx800m  -XX:MaxNewSize=256m"

Java堆記憶體(heap memory)的十個要點

1. Java堆記憶體是作業系統配置設定給JVM的記憶體的一部分。

2. 當我們建立對象時,它們存儲在Java堆記憶體中。

3. 為了便于垃圾回收,Java堆空間分成三個區域,分别叫作New Generation, Old Generation或叫作Tenured Generation,還有Perm Space。

4. 你可以通過用JVM的指令行選項 -Xms, -Xmx, -Xmn來調整Java堆空間的大小。不要忘了在大小後面加上”M”或者”G”來表示機關。舉個例子,你可以用 -Xmx256m來設定堆記憶體最大的大小為256MB。

5. 你可以用JConsole或者 Runtime.maxMemory(), Runtime.totalMemory(), Runtime.freeMemory()來檢視Java中堆記憶體的大小。

6. 你可以使用指令“jmap”來獲得heap dump,用“jhat”來分析heap dump。

7. Java堆空間不同于棧空間,棧空間是用來儲存調用棧和局部變量的。

8. Java垃圾回收器是用來将死掉的對象(不再使用的對象)所占用的記憶體回收回來,再釋放到Java堆空間中。

9. 當你遇到java.lang.outOfMemoryError時,不要緊張,有時候僅僅增加堆空間就可以了,但如果經常出現的話,就要看看Java程式中是不是存在記憶體洩露了。

10. 請使用Profiler和Heap dump分析工具來檢視Java堆空間,可以檢視給每個對象配置設定了多少記憶體。