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