JVM垃圾收器
JVM垃圾收集器收集器采用分代收集算法驳棱,堆被劃分為新生代和老年代。新生代主要存儲(chǔ)新創(chuàng)建的對(duì)象和尚未進(jìn)入老年代的對(duì)象薄货。老年代存儲(chǔ)經(jīng)過(guò)多次新生代GC(Minor GC)任然存活的對(duì)象缤至。
新生代
程序新創(chuàng)建的對(duì)象都是從新生代分配內(nèi)存,新生代由Eden Space和兩塊相同大小的Survivor Space(通常又稱S0和S1或From和To)構(gòu)成姨谷,可通過(guò)-Xmn參數(shù)來(lái)指定新生代的大小逗宁,也可以通過(guò)-XX:SurvivorRation來(lái)調(diào)整Eden Space及Survivor Space的大小。?
老年代?
用于存放經(jīng)過(guò)多次新生代GC任然存活的對(duì)象梦湘,例如緩存對(duì)象瞎颗,新建的對(duì)象也有可能直接進(jìn)入老年代,主要有兩種情況:①.大對(duì)象捌议,可通過(guò)啟動(dòng)參數(shù)設(shè)置-XX:PretenureSizeThreshold=1024(單位為字節(jié)哼拔,默認(rèn)為0)來(lái)代表超過(guò)多大時(shí)就不在新生代分配,而是直接在老年代分配瓣颅。②.大的數(shù)組對(duì)象倦逐,切數(shù)組中無(wú)引用外部對(duì)象。 老年代所占的內(nèi)存大小為-Xmx對(duì)應(yīng)的值減去-Xmn對(duì)應(yīng)的值宫补。
Young Generation? ? ? ? ? ? Eden + From Space + To Space
Eden? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?存放新生的對(duì)象
Survivor Space (from to )? 有兩個(gè)檬姥,存放每次垃圾回收后存活的對(duì)象
Old Generation? ? ? ? ? ? ? ? ? Old Space 生命周期長(zhǎng)的存活對(duì)象
垃圾收集執(zhí)行規(guī)則
對(duì)象內(nèi)存一般在Eden區(qū)中分配,大對(duì)象(數(shù)組守谓,長(zhǎng)字符串)在老年代分配內(nèi)存穿铆,當(dāng)Eden內(nèi)存不足時(shí)會(huì)發(fā)起MinorGC,發(fā)起前會(huì)檢查老年代最大連續(xù)空間是否足夠新生代對(duì)象空間(這也稱為空間分配擔(dān)保)斋荞,因?yàn)槭遣捎脧?fù)制算法將不回收的對(duì)象復(fù)制到Survivor區(qū)荞雏,Survivor區(qū)如果無(wú)法容納就會(huì)復(fù)制到老年代;如果Survivor區(qū)對(duì)象通過(guò)一次MinorGc,年齡計(jì)數(shù)器+1凤优,年齡超過(guò)設(shè)置的閾值(-XX:MaxTenuringThreshold=15)后就會(huì)進(jìn)入老年代悦陋。
垃圾收集器回收對(duì)象
? ? 通俗講,就是不可能再被任何途徑使用的對(duì)象就會(huì)被垃圾收集器回收筑辨,現(xiàn)在常見的垃圾收集器采用的收集算法有:
? ? ? ? ? ? 引用計(jì)數(shù)算法: 對(duì)象中添加引用計(jì)數(shù)器俺驶,有引用+1,引用失效-1,計(jì)數(shù)器為0表示未被引用可以回收
? ? ? ? ? ? 可達(dá)性分析算法:通過(guò)成為GC Root對(duì)象作為起點(diǎn)棍辕,從根節(jié)點(diǎn)搜索到達(dá)子節(jié)點(diǎn)的路徑稱為引用鏈暮现,若Gc Root 到對(duì)象不可達(dá),則判 定對(duì)象為可回收楚昭。
? ? Java垃圾收集器采用可達(dá)性分析算法栖袋,標(biāo)記為可回收對(duì)象至少經(jīng)歷兩次標(biāo)記過(guò)程:
? ? ?a.? 判斷Gc Root引用鏈?zhǔn)欠窨蛇_(dá),不可達(dá)情況下判斷是否有必要對(duì)象的finalize(),若有抚太,則將這個(gè)對(duì)象放置F-Queue隊(duì)列塘幅,稍后由虛擬機(jī)自動(dòng)建立的低優(yōu)先級(jí)的Finalizer線程去觸發(fā)finalize();
? ? ?b.? GC會(huì)對(duì)F-Queue中對(duì)象進(jìn)行第二次小規(guī)模標(biāo)記尿贫,對(duì)象可以通過(guò)finalize()拯救自己电媳,否則就會(huì)被回收。
垃圾收集算法細(xì)節(jié)
標(biāo)記清除算法:Mark-Sweep? 標(biāo)記出所有的需要回收的對(duì)象庆亡,統(tǒng)計(jì)回收所有回收的對(duì)象;缺點(diǎn)是效率不高匾乓,會(huì)產(chǎn)生大量的不連續(xù)內(nèi)存碎片,導(dǎo)致分配大對(duì)象內(nèi)存時(shí)無(wú)法獲取連續(xù)的內(nèi)存空間
復(fù)制算法:使用指針實(shí)現(xiàn)內(nèi)存空間的復(fù)制清理身冀,HotSpot使用此種算法钝尸,Java堆內(nèi)存分為新生代和老年代括享,?新生代默認(rèn)劃分Eden&Survivor(8:1)搂根,GC觸發(fā)時(shí),會(huì)將活動(dòng)對(duì)象復(fù)制到Survivor區(qū)铃辖,當(dāng)Survivor空間不夠時(shí)會(huì)進(jìn)入老年代空間,比如長(zhǎng)期存活對(duì)象(Survivor區(qū)對(duì)象通過(guò)一次MinorGc剩愧,年齡計(jì)數(shù)器+1,年齡超過(guò)進(jìn)入老年代)娇斩,大對(duì)象(長(zhǎng)字符串仁卷、數(shù)組);?缺點(diǎn):對(duì)象存活率較高時(shí)就會(huì)進(jìn)行頻繁的復(fù)制犬第,效率會(huì)變低
標(biāo)記整理算法:在標(biāo)記清除算法基礎(chǔ)上锦积,將存活的對(duì)象移向一端,然后直接清理端邊界以外的內(nèi)存
分代收集算法:就是將以上幾種算法擇優(yōu)分區(qū)使用歉嗓,新生代(Minor GC)中使用復(fù)制算法丰介,老年代(Major GC)使用標(biāo)記? 整理算法進(jìn)行回收