垃圾回收機制

1)問什么是垃圾

一般來說沒有被引用的對象就是垃圾,就是要被清除王暗, 有個例外如果幾個對象引用形成一個環(huán),互相引用庄敛,但根訪問不到它們俗壹,這幾個對象也是垃圾,也要被清除藻烤。

2)如何檢垃圾

垃圾回收策略:
  • 標記清除
    標記清除是最常用的垃圾回收方式绷雏。 當變量進入執(zhí)行環(huán)境時,就標記這個變量為"進入環(huán)境"怖亭。 當變量離開環(huán)境時涎显,則將其標記為"離開環(huán)境"。被標記為離開環(huán)境的變量兴猩,在下一次垃圾回收啟動時期吓,就會被釋放掉占用的空間。

1倾芝、垃圾收集器在運行的時候會給存儲在內(nèi)存中的所有變量都加上標記(當然讨勤,可以使用任何標記方式)。

2晨另、然后潭千,它會去掉運行環(huán)境中的變量以及被環(huán)境中變量所引用的變量的標記

3、此后借尿,依然有標記的變量就被視為準備刪除的變量刨晴,原因是在運行環(huán)境中已經(jīng)無法訪問到這些變量了。

4路翻、最后狈癞,垃圾收集器完成內(nèi)存清除工作,銷毀那些帶標記的值并回收它們所占用的內(nèi)存空間帚桩。

  • 引用計數(shù)法
    跟蹤記錄每個值被引用的次數(shù)亿驾。當聲明了一個變量并將一個引用類型值賦給該變量時,則這個值的引用次數(shù)就是1账嚎。如果同一個值又被賦給另一個變量莫瞬,則該值的引用次數(shù)加1儡蔓。相反,如果包含對這個值引用的變量又取得了另外一個值疼邀,則這個值的引用次數(shù)減1喂江。當這個值的引用次數(shù)變成0時,則說明沒有辦法再訪問這個值了旁振,因而就可以將其占用的內(nèi)存空間回收回來获询。這樣,當垃圾回收器下次再運行時拐袜,它就會釋放那些引用次數(shù)為0的值所占用的內(nèi)存吉嚣。

缺點:無法解決循環(huán)引用:
要解決循環(huán)引用的問題,最好是在不使用它們的時候?qū)⑺鼈兪謩釉O為空蹬铺。

幾種垃圾回收算法

一種算法是標記 標記-清除 算法尝哆,還想說出不同的算法可以參考這里

1甜攀、 標記-清除算法 Mark-Sweep GC

分為兩個階段:

  • 標記階段:從根集合出發(fā)秋泄,將所有活動對象及其子對象打上標記
  • 清除階段:遍歷堆,將非活動對象(未打上標記)的連接到空閑鏈表上
優(yōu)點
  • 實現(xiàn)簡單规阀, 容易和其他算法組合
缺點
  • 碎片化恒序, 會導致無數(shù)小分塊散落在堆的各處
  • 分配速度不理想,每次分配都需要遍歷空閑列表找到足夠大的分塊
  • 與寫時復制技術不兼容谁撼,因為每次都會在活動對象上打上標記
2歧胁、標記整理(或標記壓縮)

和“標記-清除”相似,不過在標記階段后它將所有活動對象緊密的排在堆的一側(cè)(壓縮)厉碟,消除了內(nèi)存碎片与帆, 不過壓縮是需要花費計算成本的。如下圖過程墨榄,標記后需要定位各個活動對象的新內(nèi)存地址,然后再移動對象勿她,總共搜索了3次堆袄秩。

優(yōu)點
  • 有效利用了堆,不會出現(xiàn)內(nèi)存碎片 也不會像復制算法那樣只能利用堆的一部分
缺點
  • 壓縮過程的開銷逢并,需要多次搜索堆
3之剧、引用計數(shù) Reference Counting

引用計數(shù),就是記錄每個對象被引用的次數(shù)砍聊,每次新建對象背稼、賦值引用和刪除引用的同時更新計數(shù)器,如果計數(shù)器值為0則直接回收內(nèi)存玻蝌。 很明顯蟹肘,引用計數(shù)最大的優(yōu)勢是暫停時間短

優(yōu)點
  • 可即刻回收垃圾
  • 最大暫停時間短
  • 沒有必要沿指針查找词疼, 不要和標記-清除算法一樣沿著根集合開始查找
缺點
  • 循環(huán)引用無法回收
4、 GC 復制算法

將堆分為兩個大小相同的空間 From 和 To帘腹, 利用 From 空間進行分配贰盗,當 From 空間滿的時候,GC將其中的活動對象復制到 To 空間阳欲,之后將兩個空間互換即完成GC舵盈。

優(yōu)點
  • 優(yōu)秀的吞吐量, 只需要關心活動對象
  • 可實現(xiàn)高速分配球化; 因為分塊是連續(xù)的秽晚,不需要使用空閑鏈表
  • 不會發(fā)生碎片化
  • 與緩存兼容
缺點
  • 堆使用率低
  • 遞歸調(diào)用函數(shù), 復制子對象需要遞歸調(diào)用復制函數(shù) 消耗棧
5筒愚、分代回收

詳見鏈接:https://blog.csdn.net/qq_41257129/article/details/104199725

出發(fā)點:大部分對象生成后馬上就變成垃圾赴蝇,很少有對象能活的很久

新生代 = 生成空間 + 2 * 幸存區(qū) (使用復制算法)
老年代 (使用-清除算法)

  • 新生代中的對象:為存活時間較短的對象
  • 老生代中的對象:為存活較長或常駐內(nèi)存的對象

對象在生成空間創(chuàng)建,當生成空間滿之后進行 minor gc锨能,將活動對象復制到第一個幸存區(qū)扯再,并增加其“年齡” age,當這個幸存區(qū)滿之后再將此次生成空間和這個幸存區(qū)的活動對象復制到另一個幸存區(qū)址遇,如此反復熄阻,當活動對象的 age 達到一定次數(shù)后將其移動到老年代; 當老年代滿的時候就用標記-清除或標記-壓縮算法進行major gc

缺點:只能使用堆內(nèi)存的一半倔约。
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秃殉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子浸剩,更是在濱河造成了極大的恐慌钾军,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绢要,死亡現(xiàn)場離奇詭異吏恭,居然都是意外死亡,警方通過查閱死者的電腦和手機重罪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門樱哼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人剿配,你說我怎么就攤上這事搅幅。” “怎么了呼胚?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵茄唐,是天一觀的道長。 經(jīng)常有香客問我蝇更,道長沪编,這世上最難降的妖魔是什么呼盆? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮漾抬,結(jié)果婚禮上宿亡,老公的妹妹穿的比我還像新娘。我一直安慰自己纳令,他們只是感情好挽荠,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著平绩,像睡著了一般圈匆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捏雌,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天跃赚,我揣著相機與錄音,去河邊找鬼性湿。 笑死纬傲,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的肤频。 我是一名探鬼主播叹括,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宵荒!你這毒婦竟也來了汁雷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤报咳,失蹤者是張志新(化名)和其女友劉穎侠讯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暑刃,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡厢漩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了岩臣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袁翁。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖婿脸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柄驻,我是刑警寧澤狐树,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站鸿脓,受9級特大地震影響抑钟,放射性物質(zhì)發(fā)生泄漏涯曲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一在塔、第九天 我趴在偏房一處隱蔽的房頂上張望幻件。 院中可真熱鬧,春花似錦蛔溃、人聲如沸绰沥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽徽曲。三九已至,卻和暖如春麸塞,著一層夾襖步出監(jiān)牢的瞬間秃臣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工哪工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奥此,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓雁比,卻偏偏與公主長得像稚虎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子章贞,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • JS中的內(nèi)存管理 內(nèi)存祥绞,是由可讀寫單元組成,表示一片可操作性的空間鸭限。我們平常創(chuàng)建基本類型蜕径,對象,數(shù)組等都需要內(nèi)存败京。...
    小q閱讀 735評論 0 0
  • 1兜喻、范圍:要回收哪些區(qū)域 在JVM五種內(nèi)存模型中,有三個是不需要進行垃圾回收的:程序計數(shù)器赡麦、JVM棧朴皆、本地方法棧。...
    冰河winner閱讀 533評論 0 2
  • 一泛粹、垃圾回收機制的基本概念 1.什么是垃圾回收遂铡? Garbage Collection 垃圾收集。這里所謂的垃圾指...
    L_又不是不能用閱讀 1,767評論 0 0
  • 轉(zhuǎn)載請注明出處 :) 上表僅僅羅列出一小部分主流語言的垃圾回收機制晶姊,'機制原理'只說明該語言主要使用的機制扒接,不代表...
    王韓峰閱讀 420評論 0 4
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁钾怔,有人驚喜有人失落碱呼,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,536評論 28 53