chapter-4 GC算法與種類

GC 算法與種類

■ GC的概念

■ GC算法

????? 引用計(jì)數(shù)法

????? 標(biāo)記清除

????? 標(biāo)記壓縮

????? 復(fù)制算法

■?可觸及性

■ Stop-The-World

GC的概念

■ Garbage Collection 垃圾收集

■?1960年 List 使用了GC

■?Java中,GC的對象是堆空間和永久區(qū)

引用計(jì)數(shù)法

■?老牌垃圾回收算法

■ 通過引用計(jì)算來回收垃圾

■?使用者

? ????COM

? ????ActionScript3

????? Python

■?引用計(jì)數(shù)器的實(shí)現(xiàn)很簡單,對于一個對象A,只要有任何一個對象引用了A,則A的引用計(jì)數(shù)器就加1,當(dāng)引用失效時(shí),引用計(jì)數(shù)器就減1。只要對象A的引用計(jì)數(shù)器的值為0,則對象A就不可能再被使用。

■?引用計(jì)數(shù)法的問題

? ????引用和去引用伴隨加法和減法,影響性能

? ????很難處理循環(huán)引用

標(biāo)記 - 清除

■ 標(biāo)記-清除算法是現(xiàn)代垃圾回收算法的思想基礎(chǔ)。標(biāo)記-清除算法將垃圾回收分為兩個階段:標(biāo)記階段和清除階段。一種可行的實(shí)現(xiàn)是,在標(biāo)記階段,首先通過根節(jié)點(diǎn),標(biāo)記所有從根節(jié)點(diǎn)開始的可達(dá)對象。因此,未被標(biāo)記的對象就是未被引用的垃圾對象。然后,在清除階段,清除所有未被標(biāo)記的對象。

標(biāo)記 - 壓縮

■ 標(biāo)記-壓縮算法適合用于存活對象較多的場合,如老年代。它在標(biāo)記-清除算法的基礎(chǔ)上做了一些優(yōu)化。和標(biāo)記-清除算法一樣,標(biāo)記-壓縮算法也首先需要從根節(jié)點(diǎn)開始,對所有可達(dá)對象做一次標(biāo)記。但之后,它并不簡單的清理未標(biāo)記的對象,而是將所有的存活對象壓縮到內(nèi)存的一端。之后,清理邊界外所有的空間。

復(fù)制算法

■ 與標(biāo)記-清除算法相比,復(fù)制算法是一種相對高效的回收方法

■ 不適用于存活對象較多的場合 如老年代

■ 將原有的內(nèi)存空間分為兩塊,每次只使用其中一塊,在垃圾回收時(shí),將正在使用的內(nèi)存中的存活對象復(fù)制到未使用的內(nèi)存塊中,之后,清除正在使用的內(nèi)存塊中的所有對象,交換兩個內(nèi)存的角色,完成垃圾回收

分代思想

■ 依據(jù)對象的存活周期進(jìn)行分類,短命對象歸為新生代,長命對象歸為老年代。

■ 根據(jù)不同代的特點(diǎn),選取合適的收集算法?????

? ????少量對象存活,適合復(fù)制算法

? ????大量對象存活,適合標(biāo)記清理或者標(biāo)記壓縮

GC算法總結(jié)整理

■?引用計(jì)數(shù)

? ?? ??沒有被Java采用

■ 標(biāo)記-清除

■?標(biāo)記-壓縮

■?復(fù)制算法

? ?? ? 新生代

可觸及性

■?可觸及的

? ????從根節(jié)點(diǎn)可以觸及到這個對象

■?可復(fù)合的

? ????一旦所有引用被釋放,就是可復(fù)活狀態(tài)

? ????因?yàn)樵趂inalize()中可能復(fù)活該對象

■?不可觸及的????

? ????在finalize()后,可能會進(jìn)入不可觸及狀態(tài)

??????不可觸及的對象不可能復(fù)活

??????可以回收

■?經(jīng)驗(yàn):避免使用finalize(),操作不慎可能導(dǎo)致錯誤

■?優(yōu)先級低,何時(shí)被調(diào)用, 不確定????

? ????何時(shí)發(fā)生GC不確定

■?可以使用try-catch-finally來替代它

■ 根

? ??? 棧中引用的對象

??????方法區(qū)中靜態(tài)成員或者常量引用的對象(全局對象)

??????JNI方法棧中引用對象

Stop-The-World

■ Stop-The-World

? ????棧中引用的對象

??????全局停頓,所有Java代碼停止,native代碼可以執(zhí)行,但不能和JVM交互

??????多半由于GC引起:Dump線程,死鎖檢查,堆Dump

■ GC時(shí)為什么會有全局停頓?

????? 類比在聚會時(shí)打掃房間,聚會時(shí)很亂,又有新的垃圾產(chǎn)生,房間永遠(yuǎn)打掃不干凈,只有讓大家停止活動了,才能將房間打掃干凈

■ 危害

????? 長時(shí)間服務(wù)停止,沒有響應(yīng)

????? 遇到HA系統(tǒng),可能引起主備切換,嚴(yán)重危害生產(chǎn)環(huán)境

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

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

  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虛擬機(jī)(JVM)垃圾回收器提供...
    簡欲明心閱讀 90,374評論 17 311
  • 一. 垃圾回收的意義 在C++中,對象所占的內(nèi)存在程序結(jié)束運(yùn)行之前一直被占用,在明確釋放之前不能分配給其它對...
    Stan_Z閱讀 2,055評論 0 25
  • 原文閱讀 前言 這段時(shí)間懈怠了,罪過! 最近看到有同事也開始用上了微信公眾號寫博客了,挺好的~給他們點(diǎn)贊,這博客我...
    碼農(nóng)戲碼閱讀 6,152評論 2 31
  • JVM架構(gòu) 當(dāng)一個程序啟動之前,它的class會被類裝載器裝入方法區(qū)(Permanent區(qū)),執(zhí)行引擎讀取方法區(qū)的...
    cocohaifang閱讀 1,845評論 0 7
  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡(luò)上收集的一些資料的整理,因此不免有一些不準(zhǔn)確的地方,同時(shí)不同JDK版本的...
    高廣超閱讀 16,054評論 3 83

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