前言
首先預設大家知道新生代,老年代和永久代的概念,不懂的請自行百度。
1.堆記憶體溢出
新生代+老年代 = 堆記憶體, (OutOfMemoryError:Java heap space) 是指堆溢出
可以通過設定-Xms:1024m, -Xmx:2048,來設定堆記憶體大小,其中,-Xms:表示初始化堆大小,-Xmx:表示最大堆大小
2. 永久代溢出
永久代溢出(OutOfMemoryError: PermGen space)可以分為兩種情況,第一種是常量池溢出,第二種是方法區溢出。可以通過設定-XX:PermSize = 512m, -XX:MaxPermSize=1024m,來改變永久代記憶體大小。
3.棧記憶體溢出
一般遞歸容易引起棧記憶體溢出(StackOverflowError)
-Xss:1m,表示每個線程堆棧的大小
常用法則1:
堆初始值和最大值設定為老年代的3~4倍
常用法則2:
永久代的初始值和最大值應該比永久代活躍資料大1.2~1.5倍
常用法則3:
新生代空間應該為老年代空間活躍資料的1~1.5倍
記憶體溢出常見原因:
棧記憶體溢出:程式所要求的棧深度過大。
堆記憶體溢出: 厘清記憶體洩露還是 記憶體容量不足。洩露則看對象如何被 GC Root 引用,不足則通過調大-Xms,-Xmx參數。
永久代溢出:Class對象未被釋放,Class對象占用資訊過多,有過多的Class對象。