日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

《深入理解Java虚拟机》笔记3——7种垃圾收集器

發布時間:2025/3/21 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《深入理解Java虚拟机》笔记3——7种垃圾收集器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如果說收集算法是內存回收的方法論,那么垃圾收集器就是內存回收的具體實現。**Java虛擬機規范中對垃圾收集器應該如何實現并沒有任何規定,因此不同的廠商、版本的虛擬機所提供的垃圾收集器都可能會有很大差別,并且一般都會提供參數供用戶根據自己的應用特點和要求組合出各個年代所使用的收集器。接下來討論的收集器基于JDK1.7 Update 14 之后的HotSpot虛擬機(在此版本中正式提供了商用的G1收集器,之前G1仍處于實驗狀態),該虛擬機包含的所有收集器如下圖所示:

?

以上是 HotSpot 虛擬機中的 7 個垃圾收集器,連線表示垃圾收集器可以配合使用。

  • 單線程與多線程:單線程指的是垃圾收集器只使用一個線程進行收集,而多線程使用多個線程;
  • 串行與并行:串行指的是垃圾收集器與用戶程序交替執行,這意味著在執行垃圾收集的時候需要停頓用戶程序;并行指的是垃圾收集器和用戶程序同時執行。除了 CMS 和 G1 之外,其它垃圾收集器都是以串行的方式執行。

相關概念

并行和并發

  • 并行(Parallel):指多條垃圾收集線程并行工作,但此時用戶線程仍然處于等待狀態。
  • 并發(Concurrent):指用戶線程與垃圾收集線程同時執行(但不一定是并行的,可能會交替執行),用戶程序在繼續運行。而垃圾收集程序運行在另一個CPU上。

吞吐量(Throughput)

吞吐量就是CPU用于運行用戶代碼的時間CPU總消耗時間的比值,即

吞吐量 = 運行用戶代碼時間 /(運行用戶代碼時間 + 垃圾收集時間)。

假設虛擬機總共運行了100分鐘,其中垃圾收集花掉1分鐘,那吞吐量就是99%。

Minor GC 和 Full GC

  • 新生代GC(Minor GC):指發生在新生代的垃圾收集動作,因為Java對象大多都具備朝生夕滅的特性,所以Minor GC非常頻繁,一般回收速度也比較快。具體原理見上一篇文章。
  • 老年代GC(Major GC / Full GC):指發生在老年代的GC,出現了Major GC,經常會伴隨至少一次的Minor GC(但非絕對的,在Parallel Scavenge收集器的收集策略里就有直接進行Major GC的策略選擇過程)。Major GC的速度一般會比Minor GC慢10倍以上。

各收集器闡述

1. Serial 收集器

?

Serial 翻譯為串行,也就是說它以串行的方式執行。

它是單線程的收集器,只會使用一個線程進行垃圾收集工作。

它的優點是簡單高效,對于單個 CPU 環境來說,由于沒有線程交互的開銷,因此擁有最高的單線程收集效率。

它是 Client 模式下的默認新生代收集器,因為在該應用場景下,分配給虛擬機管理的內存一般來說不會很大。Serial 收集器收集幾十兆甚至一兩百兆的新生代停頓時間可以控制在一百多毫秒以內,只要不是太頻繁,這點停頓是可以接受的。

2. ParNew 收集器

?

它是 Serial 收集器的多線程版本。

是 Server 模式下的虛擬機首選新生代收集器,除了性能原因外,主要是因為除了 Serial 收集器,只有它能與 CMS 收集器配合工作。

默認開啟的線程數量與 CPU 數量相同,可以使用 -XX:ParallelGCThreads 參數來設置線程數。

3. Parallel Scavenge 收集器

與 ParNew 一樣是多線程收集器。

其它收集器關注點是盡可能縮短垃圾收集時用戶線程的停頓時間,而它的目標是達到一個可控制的吞吐量,它被稱為“吞吐量優先”收集器。這里的吞吐量指 CPU 用于運行用戶代碼的時間占總時間的比值。

停頓時間越短就越適合需要與用戶交互的程序,良好的響應速度能提升用戶體驗。而高吞吐量則可以高效率地利用 CPU 時間,盡快完成程序的運算任務,適合在后臺運算而不需要太多交互的任務。

縮短停頓時間是以犧牲吞吐量和新生代空間來換取的:新生代空間變小,垃圾回收變得頻繁,導致吞吐量下降。

可以通過一個開關參數打開 GC 自適應的調節策略(GC Ergonomics),就不需要手工指定新生代的大小(-Xmn)、Eden 和 Survivor 區的比例、晉升老年代對象年齡等細節參數了。虛擬機會根據當前系統的運行情況收集性能監控信息,動態調整這些參數以提供最合適的停頓時間或者最大的吞吐量。

4. Serial Old 收集器

?

是 Serial 收集器的老年代版本,也是給 Client 模式下的虛擬機使用。如果用在 Server 模式下,它有兩大用途:

  • 在 JDK 1.5 以及之前版本(Parallel Old 誕生以前)中與 Parallel Scavenge 收集器搭配使用。
  • 作為 CMS 收集器的后備預案,在并發收集發生 Concurrent Mode Failure 時使用。

5. Parallel Old 收集器

?

是 Parallel Scavenge 收集器的老年代版本。

在注重吞吐量以及 CPU 資源敏感的場合,都可以優先考慮 Parallel Scavenge 加 Parallel Old 收集器。

6. CMS 收集器

?

CMS(Concurrent Mark Sweep),Mark Sweep 指的是標記 - 清除算法。

分為以下四個流程:

  • 初始標記:僅僅只是標記一下 GC Roots 能直接關聯到的對象,速度很快,需要停頓。
  • 并發標記:進行 GC Roots Tracing 的過程,它在整個回收過程中耗時最長,不需要停頓。
  • 重新標記:為了修正并發標記期間因用戶程序繼續運作而導致標記產生變動的那一部分對象的標記記錄,需要停頓。
  • 并發清除:不需要停頓。

在整個過程中耗時最長的并發標記和并發清除過程中,收集器線程都可以與用戶線程一起工作,不需要進行停頓。

具有以下缺點:

  • 吞吐量低:低停頓時間是以犧牲吞吐量為代價的,導致 CPU 利用率不夠高。
  • 無法處理浮動垃圾,可能出現 Concurrent Mode Failure。浮動垃圾是指并發清除階段由于用戶線程繼續運行而產生的垃圾,這部分垃圾只能到下一次 GC 時才能進行回收。由于浮動垃圾的存在,因此需要預留出一部分內存,意味著 CMS 收集不能像其它收集器那樣等待老年代快滿的時候再回收。如果預留的內存不夠存放浮動垃圾,就會出現 Concurrent Mode Failure,這時虛擬機將臨時啟用 Serial Old 來替代 CMS。
  • 標記 - 清除算法導致的空間碎片,往往出現老年代空間剩余,但無法找到足夠大連續空間來分配當前對象,不得不提前觸發一次 Full GC。

7. G1 收集器

G1(Garbage-First),它是一款面向服務端應用的垃圾收集器,在多 CPU 和大內存的場景下有很好的性能。HotSpot 開發團隊賦予它的使命是未來可以替換掉 CMS 收集器。

堆被分為新生代和老年代,其它收集器進行收集的范圍都是整個新生代或者老年代,而 G1 可以直接對新生代和老年代一起回收。

?

G1 把堆劃分成多個大小相等的獨立區域(Region),新生代和老年代不再物理隔離。

?

通過引入 Region 的概念,從而將原來的一整塊內存空間劃分成多個的小空間,使得每個小空間可以單獨進行垃圾回收。這種劃分方法帶來了很大的靈活性,使得可預測的停頓時間模型成為可能。通過記錄每個 Region 垃圾回收時間以及回收所獲得的空間(這兩個值是通過過去回收的經驗獲得),并維護一個優先列表,每次根據允許的收集時間,優先回收價值最大的 Region。

每個 Region 都有一個 Remembered Set,用來記錄該 Region 對象的引用對象所在的 Region。通過使用 Remembered Set,在做可達性分析的時候就可以避免全堆掃描。

?

如果不計算維護 Remembered Set 的操作,G1 收集器的運作大致可劃分為以下幾個步驟:

  • 初始標記
  • 并發標記
  • 最終標記:為了修正在并發標記期間因用戶程序繼續運作而導致標記產生變動的那一部分標記記錄,虛擬機將這段時間對象變化記錄在線程的 Remembered Set Logs 里面,最終標記階段需要把 Remembered Set Logs 的數據合并到 Remembered Set 中。這階段需要停頓線程,但是可并行執行。
  • 篩選回收:首先對各個 Region 中的回收價值和成本進行排序,根據用戶所期望的 GC 停頓時間來制定回收計劃。此階段其實也可以做到與用戶程序一起并發執行,但是因為只回收一部分 Region,時間是用戶可控制的,而且停頓用戶線程將大幅度提高收集效率。

具備如下特點:

  • 空間整合:整體來看是基于“標記 - 整理”算法實現的收集器,從局部(兩個 Region 之間)上來看是基于“復制”算法實現的,這意味著運行期間不會產生內存空間碎片。
  • 可預測的停頓:能讓使用者明確指定在一個長度為 M 毫秒的時間片段內,消耗在 GC 上的時間不得超過 N 毫秒。

總結

?收集器串行、并行or并發新生代/老年代算法目標適用場景
?Serial串行新生代復制算法響應速度優先單CPU環境下的Client模式?
?Serial Old串行老年代標記-整理響應速度優先單CPU環境下的Client模式、CMS的后備預案?
?ParNew并行新生代復制算法響應速度優先多CPU環境時在Server模式下與CMS配合?
?Parallel Scavenge并行新生代復制算法吞吐量優先在后臺運算而不需要太多交互的任務?
?Parallel Old并行老年代標記-整理吞吐量優先在后臺運算而不需要太多交互的任務?
?CMS并發老年代標記-清除響應速度優先集中在互聯網站或B/S系統服務端上的Java應用?
?G1并發both標記-整理+復制算法響應速度優先面向服務端應用,將來替換CMS?

參考資料

  • 《深入理解Java虛擬機——JVM高級特性與最佳實踐》-周志明
  • CS-Note——Java:java虛擬機

?

原文:https://meandni.com/2019/01/11/jvm_note3/

總結

以上是生活随笔為你收集整理的《深入理解Java虚拟机》笔记3——7种垃圾收集器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。