上圖就是JVM的分代模型肛冶,JVM根據(jù)Object的生命周期長(zhǎng)短滤奈,將其分為上述的三個(gè)層次(也稱(chēng)代)哀蘑。不同的層次厘贼,其GC(收集回收)算法不一樣
Young Generation(年輕代界酒、young代)
對(duì)象的初次創(chuàng)建就會(huì)在young代,大部分對(duì)象在創(chuàng)建后不再被使用嘴秸,于是就會(huì)被年輕代的GC機(jī)制清理掉篡殷,這個(gè)GC叫做Minor GC或Young GC(注意:1前鹅、這是一個(gè)停頓動(dòng)作;2、這并不表示年輕代內(nèi)存不足次坡,僅表示Eden區(qū)滿(mǎn)了,發(fā)生GC)礼殊。
年輕代包括:Eden區(qū)+兩個(gè)存活區(qū)(S0和S1屏镊,即上圖中from和to)。young gc機(jī)制如下圖:
大部分對(duì)象在創(chuàng)建完后就會(huì)被分配在Eden區(qū)剖煌,使用完被銷(xiāo)毀
當(dāng)Eden區(qū)滿(mǎn)的時(shí)候材鹦,執(zhí)行Minor GC,將可銷(xiāo)毀的對(duì)象清除掉耕姊,將剩余不可銷(xiāo)毀的對(duì)象遷移到存活區(qū)S0
每次Eden發(fā)生Minor GC時(shí)桶唐,剩余存活對(duì)象都會(huì)到S0區(qū)(此時(shí)S1區(qū)空白)
當(dāng)S0區(qū)滿(mǎn)的時(shí)候,會(huì)將其中仍然存活的對(duì)象復(fù)制到S1茉兰,同時(shí)Eden發(fā)生Minor GC時(shí)尤泽,剩余對(duì)象都會(huì)到S1區(qū)(此時(shí)S0區(qū)空白)
S0和S1會(huì)來(lái)回復(fù)制存放(總有一個(gè)是空白),但某對(duì)象來(lái)回存放次數(shù)超過(guò)15次(-XX:MaxTenuringThreshold設(shè)置的值,默認(rèn)是15)坯约,則不再存在young代熊咽,將被存放到old代
當(dāng)Minor GC時(shí),存活的對(duì)象大過(guò)S0區(qū)的大小闹丐,則會(huì)直接進(jìn)入old代
總結(jié)下:
Eden區(qū)是一個(gè)連續(xù)的空間横殴,并且S區(qū)總有一個(gè)空白的。經(jīng)過(guò)一次GC和復(fù)制后卿拴,一個(gè)S區(qū)保留存活對(duì)象衫仑,而Eden區(qū)和另一個(gè)S區(qū)可直接清空,到下一次GC時(shí)堕花,兩個(gè)S區(qū)的角色互換文狱。這就是著名的“停止-復(fù)制(Stop-and-copy)”清理法。
Old Generation(年老代缘挽、old代)
對(duì)象如果在young存活了足夠長(zhǎng)的時(shí)間(多次Minor GC瞄崇,仍未能銷(xiāo)毀),則會(huì)被復(fù)制到old代到踏,old代的空間一般比young代大杠袱,能夠存放更多的對(duì)象,一般來(lái)說(shuō)old代上GC次數(shù)也比young代少窝稿。當(dāng)old年代空間不足時(shí)楣富,將執(zhí)行Major GC,也叫Full GC伴榔。
old代的對(duì)象銷(xiāo)毀并非跟young代一樣纹蝴,而是通過(guò)標(biāo)記-整理算法,即:標(biāo)記出仍然存活的對(duì)象(存在引用的)踪少,將所有存活的對(duì)象向一端移動(dòng)塘安,以保證內(nèi)存的連續(xù)。
但當(dāng)young代進(jìn)入old代時(shí)援奢,如果進(jìn)入old代的對(duì)象大小大于old代剩余空間大小兼犯,則會(huì)直接觸發(fā)一次Full GC(可通過(guò)-XX:+HandlePromotionFailure額外設(shè)置)
題外話(huà):可能存在old代的對(duì)象引用young代對(duì)象的情況,old代會(huì)維護(hù)一個(gè)512 byte的塊“card table”集漾,里面保存old代的對(duì)象引用young代對(duì)象的記錄,當(dāng)young gc時(shí),只需查這里诗芜,不用遍歷整個(gè)old代對(duì)象
Permanent Generation(持久代)
主要存放代碼(字節(jié)碼)孩哑,字符串常量池叙淌,靜態(tài)變量鹰霍,可持久化的數(shù)據(jù)等茂洒;
每次Full GC時(shí)督勺,同時(shí)也會(huì)銷(xiāo)毀掉持久代中可銷(xiāo)毀的對(duì)象
什么是可銷(xiāo)毀的對(duì)象次询?
所有的Java對(duì)象構(gòu)成一顆近似“搜索樹(shù)”的結(jié)構(gòu),有一個(gè)root根節(jié)點(diǎn)盒卸,每次從root出發(fā)向下搜索,當(dāng)整個(gè)樹(shù)遍歷完成后虹蓄,那些不在其中的變量則視為"垃圾"。
如上圖所示,紅色部分對(duì)象均屬于可刪除對(duì)象
什么是java的root節(jié)點(diǎn)跃须?
所有正在運(yùn)行的線(xiàn)程的棧上的引用變量。所有的全局變量第练。所有ClassLoader
知乎回答:?https://www.zhihu.com/question/50381439
接下來(lái)總結(jié)的是:GC算法和部分JVM參數(shù)講解
參考資料:
http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html
https://www.zhihu.com/question/50381439