更新時間:2022-06-02 10:13:48 來源:動力節點 瀏覽1551次
什么是Java垃圾回收機制?動力節點小編來為大家解答。
垃圾收集是一種自動收集某個程序不再需要的內存區域并使該內存區域可供其他程序使用的技術。
程序的處理在垃圾回收執行過程中停止。因此,垃圾收集能否正常運行,極大地影響了系統性能。
程序中使用new創建的 Java 對象,占用 JavaVM 管理的內存空間。從創建 Java 對象到它變得多余的時間段稱為Java對象的生命周期。
Java 對象有兩種類型;壽命短的和壽命長的。對于在服務器上運行的 Java 應用程序,許多 Java 對象由請求和響應或事務管理創建。這些 Java 對象的生命周期很短,因為它們在處理結束時變得多余。另一方面,在應用程序運行時不斷使用的 Java 對象具有較長的生命周期。
為了有效地執行垃圾回收,您需要通過對生命周期短的對象執行垃圾回收來使內存回收有效。避免對重復使用的長壽命對象進行不必要的垃圾回收,有助于防止系統性能下降。這是通過按代垃圾收集來實現的。
在按代垃圾回收中,Java 對象通過將它們分成兩個區域進行管理;存儲壽命短的對象的 New 區域和存儲壽命長的對象的 Tenured 區域。New 區域進一步分為 Eden 區域和 Survivor 區域,Eden 區域保存最近使用new創建的對象,Survivor 區域保存即使多次運行垃圾收集后仍未收集的對象。執行垃圾收集超過固定次數的New區域的Java對象被認為是長期需要的Java對象,這些Java對象移動到Tenured區域。
下圖顯示了內存空間和按代垃圾回收管理的 Java 對象的概覽:
分代垃圾回收執行的垃圾回收有以下兩種類型:
復制垃圾收集
復制垃圾收集僅針對 Eden 區域和 Survivor 區域。當您使用 Eden 區域創建 Java 對象時,會發生復制垃圾收集。
您可以通過指定 Java HotSpot VM 選項來選擇串行復制垃圾收集和并行復制垃圾收集。
因為串行復制垃圾回收的處理是并行執行的,所以可以高速執行并行復制垃圾回收。但是,如果您選擇并行復制垃圾回收,則無法使用顯式管理堆功能。
默認選擇串行復制垃圾收集。請注意,本章介紹的內容適用于這兩種類型的復制垃圾回收。
對一個對象執行復制垃圾回收的次數稱為對象的年齡。
下圖顯示了一個對象的壽命和年齡之間的關系:
應用程序啟動后,初始化過程完成,復制垃圾回收已經執行了多次,長期需要的長壽命對象移動到Tenured區。結果,在啟動應用程序后不久,Java 堆就達到了穩定狀態,并且大多數創建的 Java 對象都是生命周期較短的對象。特別是,如果新區域的調整已經適當執行,那么在 Java 堆穩定后,大部分生命周期較短的對象都會在第一次復制垃圾回收期間被回收。
在JavaVM中,執行復制垃圾回收的New區的內存空間被劃分為Eden區和Survivor區。Survivor 區域進一步分為 From 空間和 To 空間。From 空間和 To 空間具有相同的內存大小。
下圖是New區域的配置:
Eden 區域是最初存儲使用new創建的對象的區域。當在程序中執行new時,會分配來自 Eden 區域的內存。
當 Eden 區域變滿時,將執行復制垃圾回收。復制垃圾回收中進行如下處理:
在 Eden 區域和 Survivor 區域的 From 空間中存在的 Java 對象中,正在使用的對象被復制到 Survivor 區域的 To 空間。未使用的 Java 對象將被銷毀。
Survivor 區域的 To 空間和 From 空間被交換。
結果,Eden 區域和 To 空間變為空,而正在使用的對象保留在 From 空間中。
將那些年齡未達到閾值的 Java 對象移動到 Tenured 區域的活動稱為Saving。當 Eden 區域和 From 空間中正在使用的對象數量增加并且這些對象將被移動到的 To 空間的內存大小不足以在復制垃圾回收期間保存這些對象時,就會發生保存。在這種情況下,無法移動到 To 空間的對象將移動到 Tenured 區域。
當對象被保存時,原本不應該保存在Tenured區的壽命短的對象,被保存到Tenured區。如此反復,本應通過復制垃圾回收來回收的對象不斷在內存空間中累積,從而增加 Java 堆的內存使用量,最終發生完整的垃圾回收。
在 JavaVM中,除了 Eden 區域、Survivor 區域和 Tenured 區域之外,您還可以使用稱為Explicit heap的區域。垃圾回收不在顯式堆區域中執行。
使用自動分配設置文件和顯式內存管理功能 API 指定要保存在顯式堆區域中的對象。在指定對象從 Survivor 區域移動到 Tenured 區域的時刻,指定對象被移動到 Explicit heap 區域。您可以指定沒有被復制垃圾回收回收的長生命周期的對象,以減少Tenured區的內存使用,并防止完全垃圾回收的發生。您還可以使用顯式內存管理功能或顯式內存管理功能 API 的自動分配設置文件在顯式堆區域中創建指定對象。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習