常州免費網(wǎng)站制作百度推廣登錄后臺登錄入口
內(nèi)存分配策略
文章目錄
- 內(nèi)存分配策略
- 一、對象優(yōu)先在Eden分配
- 二、大對象直接進入老年代
- 三、長期存活的對象將進入老年代
- 四、動態(tài)對象年齡判定
- 五、空間分配擔保
一、對象優(yōu)先在Eden分配
堆內(nèi)存有新生代和老年代,新生代中有一個Eden區(qū)和一個Survivor區(qū)(from space或者to space)。當有新的對象分配時,會優(yōu)先分配在Eden區(qū)。當Eden區(qū)空間不足分配給新對象時,會進行一次minor GC,回收完沒有引用的對象后,先考慮把一些Eden區(qū)的對象放到Survivor區(qū),如果放不下,就放到老年代中。
二、大對象直接進入老年代
大對象就是指需要連續(xù)大內(nèi)存的Java對象。比如長字符串或者數(shù)量龐大的數(shù)組。HotSpot虛擬機提供了-XX:PretenureSizeThreshold 參數(shù),當對象大于該指定大小就會直接進入老年代,這就防止了對象在Eden區(qū)和Survivor區(qū)來回復制。
三、長期存活的對象將進入老年代
對象通常在Eden區(qū)誕生,如果經(jīng)過第一次Minor GC后仍然存活并能被Survivor區(qū)存儲,該對象就會被移到Survivor區(qū),并且Age(年齡計數(shù)器)為1。此后該對象在Survivor區(qū)每經(jīng)過一次Minor GC,Age就加一。當Age達到一個閾值時,就把該對象放入老年代。
四、動態(tài)對象年齡判定
Hotspot虛擬機中并不一定要求對象的Age達到XX:MaxTenuringThreshold設(shè)定的值才進入老年代。當Survivor區(qū)有一半以上的空間都被相同年齡的對象占據(jù),年齡大于等于該值的對象都可以進入老年代。
五、空間分配擔保
在發(fā)生Minor GC之前,需要檢查老年代最大可用的連續(xù)空間是否大于新生代所有對象總和。如果大于,則可以確保Minor GC是安全的;如果不大于,則需要檢查XX:HandlePromotionFailure參數(shù)的設(shè)置值是否允許擔保失敗。若允許,則用老年代最大可用的連續(xù)空間與歷次進入老年代的對象平均大小進行對比,若大于,則進行一次有風險的Minor GC,反之進行full GC。若不允許擔保失敗,則直接進行full GC。