垃圾回收機(jī)制

今日分的學(xué)習(xí)內(nèi)容——垃圾回收機(jī)制(GC)
算是一個(gè)比較基礎(chǔ)的內(nèi)容,但是以前一直沒有時(shí)間系統(tǒng)的學(xué)習(xí)這一方面,今天就全面的來學(xué)習(xí)學(xué)習(xí)。由于Java語(yǔ)言的垃圾回收機(jī)制做的比較完善,就拿Java來說明了 。

  1. 為什么要進(jìn)行垃圾回收?
    世上本沒有GC,用C/C++的人多了,也就有了垃圾回收——魯迅。
    很明顯,一開始的語(yǔ)言都是沒有GC機(jī)制的,全靠程序員自己來管理內(nèi)容,啥時(shí)候分配了空間,就得記得還給操作系統(tǒng)。雖然這樣對(duì)于一些大神來說可以寫出高效的程序,少用內(nèi)存,但是對(duì)于大部分程序員來說還是太麻煩了,于是就想著語(yǔ)言自己給我把不用的內(nèi)存給回收就好了,也就有了后來的事情。
  2. 該怎么實(shí)現(xiàn)呢?
    想法很美好,但是要怎么做呢?
  • 第一版本V0.1——引用計(jì)數(shù)
    前輩們首先想到的就是,對(duì)于每一個(gè)對(duì)象設(shè)置一個(gè)引用計(jì)數(shù),如果沒有人對(duì)這個(gè)對(duì)象有引用了,也就不會(huì)有人用了,就可以釋放了(很像操作系統(tǒng)中對(duì)于打開文件的做法)。
    相信很多人都能想到這個(gè),前輩們也就這樣做了。這個(gè)樸素的算法很容易實(shí)現(xiàn),而且對(duì)于程序的運(yùn)行速度來說也沒有降低很多,感覺還可以。但是用著用著問題又出來了。這個(gè)問題的產(chǎn)生和內(nèi)存的管理有關(guān)系。假設(shè)我們?cè)谝黄B續(xù)的內(nèi)存中聲明了幾個(gè)對(duì)象,中間的幾個(gè)對(duì)象被釋放了,這些空出來的內(nèi)存很碎片化,操作系統(tǒng)很難利用得上,釋放也就沒有了意義。
  • 改進(jìn)版本V1.0——節(jié)點(diǎn)復(fù)制
    于是我們可以做的就是把內(nèi)存一分為二,一塊不用,一塊隨便用。設(shè)定一個(gè)鬧鐘,時(shí)間一到,把這邊的內(nèi)存中的東西集體復(fù)制到另一半中,順帶還整理了內(nèi)存(連成片了),一舉兩得 。想法很簡(jiǎn)單,實(shí)現(xiàn)也不是很難,前輩們就又用了,大家也是挺滿意的。
    可是好景不長(zhǎng),程序員中的極致派覺得這也太浪費(fèi)了,一半內(nèi)存做備份(真家里有礦),還是得改改。
  • 改進(jìn)版本V2.0——標(biāo)記-清掃
    這一次還是使用引用的做法,我們把各個(gè)對(duì)象看做節(jié)點(diǎn),這些節(jié)點(diǎn)加上它們之間的引用關(guān)系可以作為一棵樹,我們從根節(jié)點(diǎn)開始遍歷,如果到最后還有節(jié)點(diǎn)沒有包括進(jìn)來,這些節(jié)點(diǎn)就可以釋放了。
    根節(jié)點(diǎn)是一些沒有父對(duì)象來生成的。
  • 一些更高級(jí)的玩法——分代收集
    為了使得垃圾回收更加有針對(duì)性,可以把不同的對(duì)象分成不同的等級(jí)——年輕代,老年代。一般老年代已經(jīng)用了很久,一般還會(huì)繼續(xù)用下去,年輕代的很可能馬上就不用了。然后通過一定的機(jī)制完成代之間的轉(zhuǎn)移就可以了。

其他一些GC相關(guān)的問題

  1. 一個(gè)通過make()命令創(chuàng)建的緩沖區(qū)被分配了一塊內(nèi)存后。如何銷毀緩沖區(qū)并收回內(nèi)存?
    buffer = nil;在運(yùn)行時(shí),buffer = nil將啟動(dòng)垃圾回收
  2. Java 中的StrongReference、 SoftReference、 WeakReference 以及 PhantomReference是啥?
    StrongReference 是 Java 的默認(rèn)引用實(shí)現(xiàn), 它會(huì)盡可能長(zhǎng)時(shí)間的存活于 JVM 內(nèi),當(dāng)沒有任何對(duì)象指向它時(shí)將會(huì)被GC回收。
    WeakReference,顧名思義, 是一個(gè)弱引用, 當(dāng)所引用的對(duì)象在JVM 內(nèi)不再有強(qiáng)引用時(shí), 將被GC回收。
    雖然 WeakReference 與 SoftReference 都有利于提高 GC 和 內(nèi)存的效率,但是 WeakReference ,一旦失去最后一個(gè)強(qiáng)引用,就會(huì)被 GC 回收,而 SoftReference 會(huì)盡可能長(zhǎng)的保留引用直到 JVM 內(nèi)存不足時(shí)才會(huì)被回收(虛擬機(jī)保證), 這一特性使得SoftReference 非常適合緩存應(yīng)用
最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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