《調優JVM內存解決OutOfMemoryError 》
從VM規範中我們可以得到,一下幾種異常。
java.lang.StackOverflowError:(很少)
java.lang.OutOfMemoryError:heap space(比較常見)
java.lang.OutOfMemoryError: PermGen space (經常出現)
以下分別解釋一下,從最常見的開始:
-
java.lang.OutOfMemoryError
PermGen space 這個異常比較常見,是說JVM裏的Perm內存區的異常溢出,由於JVM在默認的情況下,Perm默認爲64M,而很多程序需要大量的Perm區內存,尤其使用到像Spring等框架的時候,由於需要使用到動態生成類,而這些類不能被GC自動釋放,所以導致OutOfMemoryError: PermGen space異常。解決方法很簡單,增大JVM的 -XX:MaxPermSize 啓動參數,就可以解決這個問題。
-
java.lang.OutOfMemoryError
heap space或 其它OutOfMemoryError,這個異常實際上跟上面的異常是一個異常,但解決方法不同,所以分開來寫。上面那個異常是因爲JVM的perm區內存區分少了引起的(JVM的內存區分爲 young,old,perm三種)。而這個異常是因爲JVM堆內存或者說總體分少了。解決方法是更改 -Xms -Xmx 啓動參數,通常是擴大1倍。xms是管理啓動時最小內存量的,xmx是管裏JVM最大的內存量的。
-
java.lang.StackOverflowError
老實說這個異常我也沒碰見過,但JVM Specification就提一下,規範上說有一下幾種境況可能拋出這個異常,一個是Stacks裏的線程超過允許的時候,另一個是當native method要求更大的內存,而超過native method允許的內存的時候。根據SUN的文檔,提高-XX:ThreadStackSize=512的值。