Java-GC

可達(dá)性分析算法

這個(gè)算法的基礎(chǔ)就是:有一系列的GC-Roots作為起始點(diǎn),從起始點(diǎn)向下搜索。所走過(guò)的路徑稱(chēng)為引用鏈,當(dāng)一個(gè)對(duì)象到GC Roots沒(méi)有任何引用鏈的時(shí)候,即說(shuō)明這個(gè)對(duì)象不可達(dá)的時(shí)候,則證明此對(duì)象是不可用的。

即使在可達(dá)性分析算法中不可達(dá)的對(duì)象,也并非是非死不可的,這時(shí)候他們處于緩刑階段,要真正宣告一個(gè)對(duì)象死亡,至少要經(jīng)歷兩次標(biāo)記過(guò)程:1)如果對(duì)象在可達(dá)性分析之后沒(méi)有發(fā)現(xiàn)與GC Roots 相連接的引用鏈,那么它將會(huì)被第一次標(biāo)記并進(jìn)行一次篩選:篩選的條件是該對(duì)象是否有必要執(zhí)行finalize()方法,當(dāng)對(duì)象沒(méi)有覆蓋finalize()方法,或者finalize()方法已經(jīng)被虛擬機(jī)棧調(diào)用過(guò),虛擬機(jī)將這兩種情況都視為沒(méi)有必要執(zhí)行。

如果被標(biāo)記為有必要執(zhí)行finalize()方法,那么這個(gè)對(duì)象將會(huì)被放在一個(gè)低優(yōu)先級(jí)的隊(duì)列F-Queue上,并稍后再一個(gè)虛擬機(jī)自動(dòng)建立的,低優(yōu)先級(jí)的Finalizer線程執(zhí)行它,這里所謂的執(zhí)行是指虛擬機(jī)會(huì)觸發(fā)這個(gè)方法,但并不承諾會(huì)等他運(yùn)行結(jié)束,因?yàn)槿绻幸粋€(gè)對(duì)象在finalize()方法中執(zhí)行緩慢,或者發(fā)生了死循環(huán),那么很可能導(dǎo)致F-Queue隊(duì)列中的其他對(duì)象處于永久等待中,對(duì)象要在finalize中成功拯救自己只需啊重新與任何一個(gè)對(duì)象關(guān)聯(lián)即可,譬如把自己賦值給某個(gè)對(duì)象或者成員變量即可。

垃圾收集算法

標(biāo)記清除算法

這個(gè)算法分為兩步一步是標(biāo)記,一部是清除。首先標(biāo)記出所有需要回收的對(duì)象,然后在標(biāo)記完成后統(tǒng)一回收所有被標(biāo)記的對(duì)象。缺點(diǎn):效率不高,會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片。

復(fù)制算法(一般用于年輕代)

它將可用的內(nèi)存分為大小相同的兩塊,每次只使用其中一塊,當(dāng)一塊的內(nèi)存用完了,就將還活著的對(duì)象一次性的復(fù)制到另一塊上面,再把已使用的內(nèi)存一次性的清理掉。缺點(diǎn):將內(nèi)存變?yōu)樵瓉?lái)的一半。

標(biāo)記整理算法

將所有存活的對(duì)象向一段移動(dòng)


一般,我們將內(nèi)存分為一個(gè)Eden和兩個(gè)Survivor區(qū),有兩種收集方式:minorGC和FullGC。MinorGC指的是發(fā)生在新生代的垃圾收集動(dòng)作,因?yàn)镴ava對(duì)象大多都具有朝生夕滅的特性,發(fā)生的次數(shù)多,一般回收速度也快。

FullGC:(MajorGC/FullGC):指發(fā)生在老年代的GC,比一般的MinorGC慢至少十倍以上。

以下有一些規(guī)則:大對(duì)象直接進(jìn)入老年代,超過(guò)參數(shù)-XX:PretenureSizeThreshold參數(shù)的直接進(jìn)入到老年代,防止在兩個(gè)Survivor和一個(gè)Eden區(qū)之間發(fā)生大量的內(nèi)存復(fù)制。

長(zhǎng)期存活的對(duì)象直接進(jìn)入老年代,-XX:MaxTenuringThreshold=? 如果對(duì)象出生在Eden區(qū)中并且熬過(guò)了一次MinorGC之后并且能被Survivor容納的話,對(duì)象年齡就被設(shè)置為1,對(duì)象在Survivor區(qū)中每熬過(guò)一個(gè)MinorGC年齡就增加一歲,當(dāng)增加到一定程度就會(huì)直接進(jìn)入老年代。

動(dòng)態(tài)對(duì)象規(guī)則判定:如果在Survivor空間中相同年齡所有對(duì)象大小的總和大于Survivor空間的一半,年齡大于或等于該年齡的對(duì)象就直接進(jìn)入老年代。

-Xms:堆大小的下限? ?-Xmx:堆大小的最大值? -Xmn新生代的內(nèi)存大小? ?-XX:SurvivorRatio=8 代表Eden與Survivor的比為8:1

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • GC與內(nèi)存分配策略 1 概述 說(shuō)起垃圾回收機(jī)制,大部分人都把這項(xiàng)技術(shù)當(dāng)做java語(yǔ)言的伴生產(chǎn)物。事實(shí)上,gc的歷史...
    勾小超愛(ài)吃面閱讀 910評(píng)論 0 2
  • 一、垃圾收集的意義 ?相對(duì)于C++來(lái)說(shuō),Java預(yù)言顯著的特點(diǎn)就是引入了垃圾回收機(jī)制,它使得Java程序員在編寫(xiě)程...
    SunnyMore閱讀 2,222評(píng)論 0 50
  • 這次來(lái)說(shuō)一下關(guān)于Java垃圾收集的一些思想和算法。 垃圾收集的觸發(fā)條件 1)因?yàn)镚C線程的優(yōu)先級(jí)較低,所以當(dāng)虛擬機(jī)...
    nemuni閱讀 729評(píng)論 3 1
  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虛擬機(jī)(JVM)垃圾回收器提供...
    簡(jiǎn)欲明心閱讀 90,343評(píng)論 17 311
  • 以前寫(xiě)c/c++的時(shí)候雖然也有shared_ptr這樣的自動(dòng)內(nèi)存管理機(jī)制,但是它內(nèi)部其實(shí)是通過(guò)引用計(jì)數(shù)的原理進(jìn)行內(nèi)...
    嘉偉咯閱讀 719評(píng)論 0 1

友情鏈接更多精彩內(nèi)容