Java垃圾回收

Java垃圾回收的步驟:

  1. 標記(Marking)
垃圾回收器標記堆中的對象,哪些依然被引用,哪些不再被引用。

2. 刪除(Deleting)
刪除不再被引用的對象

3. 壓縮(Compacting)
壓縮依然被引用的對象,使空閒的堆空間連接在一起,以便加快後續的空間申請

若每一次垃圾回收器在標記過程中,將堆中的對象逐個遍歷並對依舊使用的對象進行壓縮,會引發巨大時間消耗,顯然是不高效的。
通過觀察應用程序中對象的生命週期,經驗告訴我們:對象在堆中的活動時間往往較短。如下圖所示:

因此根據對象在堆中的生存時間,將他們分成3段:Young Generation、Old Generation、 Permanent Generation。
相應的,堆空間可以由如下圖所示表示:

所有新生成的對象,存儲在Young Generation空間。當Young Generation空間存滿時,觸發minor garbage collection。不被引用的對象被回收,而依然被引用的對象增加他們的生存時間(age)。當他們的age達到一定閾值時,被轉移至Old Generation空間。Old Generation空間在適當的時間觸發major garbage collection,進行垃圾回收。Permanent Generation空間存放JVM所需的元數據(metadata),描述應用程序使用的類和方法。Permanent Generation空間在執行full garbage collection時被回收。回收的空間包括不再使用的類等。

Minor garbage collection和major garbage collection都是屬於“stop the world”事件。也就是說,在進行垃圾回收時,所有其他的應用線程被阻塞,直到垃圾回收過程結束。

Young Generation空間的垃圾回收過程:
1.首先,所有新生成的對象,被分配到Eden空間。

2.當Eden空間存滿時,觸發minor garbage collection。

3.被引用的對象被移動至S0空間,然後Eden空間被清空

4.在下一次minor garbage collection時,Eden中被引用的對象轉移至S1,S0中被引用的對象轉移至S1,並且S0中被引用的對象他們的生存時間增加


5.在下一次minor garbage collection時,相反地,被引用的對象轉移至S0。

6.在一次minor garbage collection後,若young Generation中的對象,生存時間超過閾值時,該對象被轉移至old generation(下圖中的閾值爲8)。





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