java記憶體配置與參數配置__技術專題
來源:互聯網
上載者:User
一、對象優先在新生代Eden區分配 堆記憶體大小為20M,不可自動擴充,新生代記憶體為10M,預設Eden區:Survivor區為8:1,Eden區為:10Mx8/10=8129KB,survivor區大小為1024KB,新生代總可用記憶體為9216KB。 當新生代裝不下時,將租借老年代的地區。
二、大對象直接進入老年代 -XX:PretenureSizeThreshold(只對Serial和ParNew收集器生效) 大於該參數配置值的對象將直接在老年代分配。
三、長期存活對象將進入老年代 虛擬機器設計了一個對象年齡計數器,如果對象在Eden區出生並且經過第一次Minor GC後依然存活,並且可以被survivor區容納,就會被複製到survivor區並將對象年齡置為1.以後對象每熬過一次minor GC,對象年齡就+1.當對象年齡超過對象晉陞老年代的年齡閥值(預設為5),則晉陞為老年代。 -XX:MaxTenuringThreshold
Full GC 通常至少伴隨著一次Minor GC(並非絕對)
四、動態對象年齡判定 如果survivor區相同年齡所有對象大小的總和大於survivor區空間的一半,年齡大於或等於該年齡的對象在Minor GC時將複製到老年代。
雖然Minor GC時survivor區沒有足夠的空間,完成GC時會租借老年代的記憶體,但是在survivor區仍然儲存了一個指向老年代租借記憶體起始地址的引用。
五、空間分配擔保 在觸發minor GC時,虛擬機器會先檢測之前GC時租借的老年代記憶體的平均大小是否大於老年代的剩餘記憶體,如果大於,則將Minor GC變為一次Full GC,如果小於,則查看虛擬機器是否允許擔保失敗,如果允許擔保失敗,則只執行依次Minor GC,否則也要將Minor GC變為一次Full GC( 直到GC結束時才能確定到底有多少對象需要被移動到老年代,所以在GC前只能使用粗略的平均值進行判斷)。
堆記憶體 jvm初始分配的堆記憶體由-Xms指定,預設為實體記憶體的1/64;jvm最大分配的堆記憶體由-Xmx指定,預設是實體記憶體的1/4. 非堆記憶體配置 jvm使用-XX:PermSize設定非堆記憶體初始值,預設是實體記憶體的1/64,由-XX:MaxPermSize設定最大非堆記憶體的大小,預設是實體記憶體的1/4.
GC不會在主程式運行期間對PermGen Space進行清理,所以你的app會load很多class的話可能會出現PermGen Space錯誤。