什麼是 Java 垃圾收集 ?標記與清除、Young、Old、Perm 概念總結
- 在進行Java程式設計時,您經常會聽到垃圾收集這個術語。儘管在開發的早期階段沒有這些知識也可以進行開發,但最好了解一下以優化效能或防止記憶體洩漏。
- 這是在使用 Java 的公司面試中經常被問到的話題之一。
- 在本文檔中,我們將總結Java垃圾收集,以便您輕鬆理解。
- 這是一個簡短的總結,旨在幫助您理解未知概念,因此我們建議您閱讀其他文章以獲取詳細資訊。
什麼是垃圾收集?
- Garbage Collection 這個名稱的意思是垃圾的收集。 自動收集未使用的記憶體
- 未使用的記憶體:不再使用的記憶體。
- 內存收集:釋放未使用的內存,以便可以再次使用。
- Java記憶體管理是透過JVM完成的。
- 在現有語言中,程式設計師必須直接處理記憶體分配和釋放。如果記憶體沒有正確釋放,未使用的記憶體會不斷累積,從而發生記憶體洩漏。
- JVM是一個虛擬機,自動處理記憶體分配和釋放,無需使用者擔心
- 透過在執行程式時給予JVM選項來指定JVM要使用的記憶體大小。
- 透過不直接存取作業系統層級的內存,可以防止作業系統層級的記憶體洩漏。
- 垃圾收集透過從堆疊區域中刪除無法存取的物件來保護記憶體
什麼是標記和清除?
- 特徵
- 垃圾收集是使用標記和清除方法完成的
- 垃圾回收後的記憶體狀態是確保記憶體空間的狀態。
- 尋找並標記可到達的物件。垃圾收集器掃描堆疊中的所有變數以查找每個變數引用的物件。
- 所有執行緒都停止進行標記工作,稱為停止世界
- 由於上述原因,您可以透過呼叫System.gc()明確地引發垃圾回收,但不建議這樣做。
掃一掃
堆區 - Young(Eden、Survivor)、Old、Perm
- 堆區由 Young Generation、Old Generation 和 Perm 區組成
- 總共由5個區域組成
- 年輕一代:伊甸園,倖存者 0,倖存者 1
- 老一輩
- 彼爾姆地區

年輕一代
- 由Eden區、Survivor 0、Survivor 1區組成
- 伊甸園
- 新建立的物件所在的位置
- 當Eden區已滿時發生Minor GC
- 倖存者區
- 伊甸園中倖存物體所在的位置
- 有兩個區域,S0 和 S1,其中一個是空的,另一個包含倖存的物件。
- 將倖存的物件從Eden區和非空Survivor區移動到空Survivor區。
- 當從一個倖存者區域移動到另一個倖存者區域時,年齡值會增加。
- 移動如下
- S0中有存活對象,S1為空 -> 將Eden區和S0中存活對象移到S1
- S1中有存活對象,S0為空 -> 將Eden區和S1中存活對象移到S0
- 移動時,年齡值增加,存活的物體被移動到另一個倖存者區域。
老一輩
- 特徵
- 在年輕世代中存活的對象,當其年齡值超過某一值時,將被移至老年代。
- 以上步驟稱為促銷
燙髮區
- 特徵
- 元資料、類別資訊等存放的地方
- 從Java 8開始改為元空間
Minor GC & Major GC & Full GC
- GC依組織的堆區域分為Minor GC、Major GC和Full GC。
小GC
- 特徵
- GC發生在年輕代
- 將倖存的物件從 Eden 區 移動到 Survivor 區
- 當Survivor區滿時,將倖存的物件移動到Old Generation
- 命令
- 當Eden區已滿時發生Minor GC
- 將存活的物體從Eden區和Survivor區移動到空的Survivor區
伊甸園 + S0 -> S1
或 伊甸園 + S1 -> S0
- 移動時年齡值增加
Major G.C.
- 特徵
- GC發生在老年代
- Major GC發生在Old Generation區域已滿時。
- 從老一代區域中刪除無法存取的物件
完整GC
- 特徵
- 在Young Generation、Old Generation和Perm區域執行GC
- 當Full GC發生時,所有執行緒都停止。
- 發生Full GC時,Major GC、Minor GC、Perm區GC都會發生。