Java 中的垃圾收集

開放

回想一下 Java 中的垃圾回收是什麼

垃圾收集是通過銷毀未使用的對象來回收完整的運行時內存的過程。

有時程序員可能會忘記銷毀無用的對象,而分配給它們的內存並沒有被釋放。越來越多的系統內存被消耗,最終不再分配。此類應用程序遭受“內存洩漏”。

在某個點之後,不再有足夠的內存來創建新對象,並且程序由於OutOfMemoryError異常終止。

Java 中的垃圾收集是 Java 程序自動管理內存的過程。Java 程序被編譯成在 Java 虛擬機 (JVM) 上運行的字節碼。

當 Java 程序在 JVM 上運行時,對像是在堆上創建的,堆是分配給它們的內存部分。

當 Java 應用程序運行時,會在其中創建新對象。最後,一些對像不再需要了。我們可以說,在任何給定時間,堆內存都由兩種類型的對象組成。

  • Live - 這些對像被使用,它們是從其他地方引用的。
  • 已死- 這些對象未在其他任何地方使用,沒有對它們的引用。

垃圾收集器找到這些未使用的對象並將它們移除以釋放內存。

Java 中的垃圾收集是一個自動過程。程序員不需要明確標記要刪除的對象。

每個 JVM 都可以實現自己的垃圾收集版本。但是,收集器必須符合標準 JVM 規範來處理堆內存中存在的對象,以標記或識別無法訪問的對象並通過壓縮銷毀它們。

對象可達性

為了將一個對象識別為活著的,僅存在鏈接是不夠的。這是因為一些死對象可以引用其他死對象。這就是為什麼在對一個對象的所有引用中,至少應該有一個來自“活動”對象的引用是必要的。

對象可達性

垃圾收集器使用 GC Roots(垃圾收集根)的概念來區分活對象和死對象。有 100% 的活動對象,從它們中有鏈接可以使其他對象動畫化等等。

此類根的示例:

  • 由系統類加載器加載的類。
  • 現場直播。
  • 當前正在執行的方法和局部變量的參數。
  • 用作同步監視器的對象。
  • 出於某種目的從垃圾回收中保留的對象。
  • 垃圾收集器遍歷內存中的整個對像圖,從這些根開始,然後跟隨對其他對象的引用。

Java中的垃圾收集步驟

標準的垃圾回收實現分為三個步驟。

1. 將對象標記為活動的

此時,垃圾收集器 (GC) 必須通過遍歷對像圖來識別內存中的所有存活對象。

當它訪問一個對象時,它會將其標記為可用並因此處於活動狀態。所有不能從 GC 根訪問的對像都被認為是垃圾收集的候選者。

2.清理死物

在標記階段之後,內存空間被活的(訪問過的)或死的(未訪問過的)對象佔用。清理階段釋放包含這些死對象的內存碎片。

3.內存中剩餘對象的緊湊排列

上一階段移除的死對像不必彼此相鄰。因此,您冒著獲得碎片化(半空)內存空間的風險。

但是,當然,有了這個規定,就可以在垃圾收集器移除死對象的那一刻壓縮內存。其餘的將位於堆開頭的連續塊中。

壓縮過程使得為新對象順序分配內存變得更加容易。

留言
  • 受歡迎
你必須登入才能留言
此頁面尚無留言