Java中的垃圾回收算法

Java中的垃圾回收算法

1. 引用計數算法(Reference Counting Collector)

引用計數原理:
- 在堆中,對每個對象都有個引用計數器,被引用時,計數器+1;
- 當引用被置空或離開作用域,引用計數器-1。
無法解決互相引用問題,所以JVM沒有采用。同時效率低下

2. 追蹤回收算法(Tracing Collector)

原理:
- 利用JVM維護的對象引用圖,從根節點遍歷對象的引用圖,同時標記遍歷到的對象。
- 當遍歷結束後,未被標記的對象就是不再被使用的對象,可以回收。

3. 壓縮回收算法(Compacting Collector)

原理:
- 將堆中活動的對象“移動”到堆中一端,這樣會在堆中另外一端留出大的空閒區域。相當於對堆中的碎片進行處理。
該方法可以簡化消除堆碎片的工作,但每次處理會帶來性能損失。

4. 複製回收算法(Coping Collector)

原理:
- 把堆分成兩個大小相同的區域,任何時候,僅有其中之一被使用,直到這個區域被消耗完爲止。
- 此時,GC會中斷程序的執行,使用遍歷的方式將活動對象複製到另一區域中,複製過程中,緊挨着佈置,消除了內存碎片。當複製結束後,程序會繼續運行,知道此區域被使用完,然後使用同樣方式進行垃圾回收。

  • 優點: 垃圾回收的同時,對對象的不知進行了安排,消除了內存碎片
  • 缺點:需要較高的內存空間的代價;同時由於在內存調整的過程中要中斷當前執行的程序,會降低程序的執行效率。

5. 按代回收算法(Generational Collector)

原因:
複製回收算法效率低,每次處於活動狀態的對象需要被複制
程序的特點:
程序創建的大部分對象的生命週期很短,只有部分對象纔有較長生命週期
原理:
- 把堆分成兩個或多個子堆,每個子堆視爲一代。算法在收集過程中優先收集“年幼”的對象,如果一個對象多次收集仍然“存活”,那麼就可以將對象轉移到更高級的堆裏,減少掃描次數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章