GC--垃圾收集器

把週末的文章放在如今纔來寫,是本身太忙了?仍是墮落了?算法

好吧直接進入主題吧,簡單幹脆的理解會讓本身記憶深入:spa

首先說明:GC垃圾收集器關注兩件事情:線程

第一件:查找全部存活對象。對象

第二件:拋棄死對象(再也不使用的對象)。blog

 

而後再分步驟解釋這個過程:內存

第一步, 記錄全部的存活對象, 在垃圾收集中有一個叫作 標記(Marking) 的過程專門幹這件事。class

GC遍歷內存中總體的對象關係圖(object graph),從GC根元素開始掃描, 到直接引用,以及其餘對象(經過對象的屬性域)。全部GC訪問到的對象都被標記(marked)爲存活對象。object

注意:在標記階段,須要暫停全部應用線程, 以遍歷全部對象的引用關係。由於不暫停就無法跟蹤一直在變化的引用關係圖。這叫作 Stop The World pause (全線停頓)。遍歷

第二步,GC刪除不可達對象。引用

GC算法在刪除不可達對象時略有不一樣,總結以下:

一、標記-清除算法:直接忽略全部的垃圾。也就是說在標記階段完成後, 全部不可達對象佔用的內存空間, 都被認爲是空閒的, 所以能夠用來分配新對象。

優勢:很是簡單。

缺點:容易致使內存分配失敗。

 

二、標記-清除-整理算法:將全部被標記的對象(存活對象), 遷移到內存空間的起始處, 消除了標記-清除算法的缺點。

優勢:解決了內存分配失敗。

缺點:GC暫停的時間增加,須要將全部的存活對象移動到另外一個地方。

 

 

三、標記-清除-複製算法:將將全部被標記的對象(存活對象)移動到另一個空間: 存活區。

優勢:標記和複製能夠同時進行。

缺點:須要一個額外的內存區間來存放全部的存活對象。

相關文章
相關標籤/搜索