Java 垃圾回收01(基本過程)

weixin_34041003發表於2018-12-25

    支援Java語言的執行時系統,具有自動管理記憶體的功能,從而化解了C/C++程式設計師特別苦惱的記憶體管理問題,而自動化記憶體管理的核心便是自動垃圾回收。

15541434-f100eb892ba6b9d8.png

什麼是自動垃圾回收?

    自動垃圾回收是一種清理堆記憶體中無用物件的機制。該機制能夠找出堆記憶體中哪些物件正在被使用,哪些物件不會被使用,並將後者進行刪除。所謂正在被使用的物件指的是尚有引用的物件,即是說程式執行到目前為止,仍然有指標指向該物件。而未被使用的物件,是指從當前開始,將不會再有任何指標指向該物件,因此該物件佔用的記憶體需要被回收利用。

    在使用不支援自動垃圾回收的程式語言時(例如:C和C++),程式設計師需要手動申請和釋放記憶體。而支援自動垃圾回收語言的執行時系統,一般會有垃圾回收器,以代替程式設計師進行記憶體管理。本文接下來將闡述自動垃圾回收機制的基本過程。

第一步:標記

    自動垃圾回收的第一步是標記出當前堆記憶體中哪些物件正在被使用,哪些將不會再被使用。並分別進行標記,如下圖中所示,其中藍色部分表示正在被使用的物件,橙色表示不再被使用的物件。垃圾回收器需要進行掃描檢查才能知道物件的使用情況,而如果每次都對系統中所有物件進行檢查,將會消耗大量時間。

15541434-3cc078e294ded629.jpg

第二步:清除

    這一步會將對標記出的不再被使用的物件進行刪除,同時記憶體分配器會接管可用記憶體,以供分配新物件時使用。刪除後的示意圖,如下圖所示。

15541434-1934fe924d233ef2.jpg

第二步:壓縮

    為了進一步提升效能,在刪除掉未被使用的物件後,還需要將剩下的正在被使用的物件移動到一起(壓縮),這樣就可以更簡單快捷地分配新物件了。壓縮後的示意圖,如下圖所示。

15541434-f75efb9fbfe9c95b.jpg

相關文章