該圖表明jvm中的新生代,老年代,持久代; 新生代和老年代主要指堆區(管理對象),持久代主要指方法區(由於方法區裏是類信息,靜態變量,常量等須要「持久」的信息);咱們這裏主要看堆區的gc;html
新生代:裏主要分爲Eden Space 和Survivor兩塊;Eden表明「伊甸園」,新生的對象都會放到這裏,Survivor (翻譯爲倖存,這裏我理解爲在Eden區gc時,未被回收的對象會放到這個辛存區;)又包括FromSpace和ToSpace兩個區域,這兩個區域大小是同樣的;FromSpace我理解爲進行復制算法的來源區,ToSpace理解爲要放的地方;算法
老年代:主要存放通過屢次gc還存活的對象,新生代的對象能夠設置年齡閥值,超過年齡閥值的對象會轉到老年代;老年代採用的是標記壓縮算法(相較於標記清除算法不會產生內存碎片);jvm
總結理解:在GC開始的時候,對象只會存在於Eden區和名爲「From」的Survivor區,Survivor區「To」是空的。緊接着進行GC,Eden區中全部存活的對象都會被複制到「To」,而在「From」區中,仍存活的對象會根據他們的年齡值來決定去向。年齡達到必定值(年齡閾值,能夠經過-XX:MaxTenuringThreshold來設置)的對象會被移動到年老代中,沒有達到閾值的對象會被複制到「To」區域。通過此次GC後,Eden區和From區已經被清空。這個時候,「From」和「To」會交換他們的角色,也就是新的「To」就是上次GC前的「From」,新的「From」就是上次GC前的「To」。無論怎樣,都會保證名爲To的Survivor區域是空的。Minor GC會一直重複這樣的過程,直到「To」區被填滿,「To」區被填滿以後,會將全部對象移動到年老代中。spa
補充方法區和持久代的關係:方法區物理上存在於堆裏,並且是在堆的持久代裏面;但在邏輯上,方法區和堆是獨立的。
通常說堆的持久代就是說方法區;翻譯