跳至正文

什麼是 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都會發生。

來源