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

歡迎訪問 生活随笔!

生活随笔

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

java

Java虚拟机详解(四)------垃圾收集器

發布時間:2025/4/16 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java虚拟机详解(四)------垃圾收集器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  上一篇博客我們介紹了Java虛擬機垃圾回收,介紹了幾種常用的垃圾回收算法,包括標記-清除,標記整理,復制等,這些算法我們可以看做是內存回收的理論方法,那么在Java虛擬機中,由誰來具體實現這些方法呢?

  沒錯,就是本篇博客介紹的內容——垃圾收集器。

1、垃圾收集器種類

  事實上Java虛擬機規范對垃圾收集器應該如何實現,并沒有任何的規定,所以不同的廠商、不同版本的虛擬機所提供的垃圾收集器都會有所不同,并且一般都會提供參數供用戶根據自己的應用特點和要求組合出各個年代所使用的收集器。

  下圖是基于 Sun HotSpot 虛擬機1.6版 Update 22的虛擬機種類:

  

  由上圖我們可以總結出幾個結論:

  ①、新生代垃圾收集器:Serial、ParNew、Parallel Scavenge;

    老年代垃圾收集器:Serial Old(MSC)、Parallel Old、CMS;

    整堆垃圾收集器:G1

  ②、垃圾收集器之間的連線表示可以搭配使用,有如下幾種組合:

    Serial/Serial Old、Serial/CMS、ParNew/Serial Old、ParNew/CMS、Parallel Scavenge/Serial Old、Parallel Scavenge/Parallel Old、G1;

  ③、串行收集器Serial:Serial、Serial Old

    并行收集器 Parallel:Parallel Scavenge、Parallel Old

    并發收集器:CMS、G1

  ps:對于文章中有一些名詞不理解的,可以先看本篇博客最后一個小節。

2、Serial收集器

  這是一個最基本,歷史最悠久的垃圾收集器,是JDK1.3之前新生代唯一的垃圾收集器。

  該收集器有如下特點:

  ①、作用于新生代

  由上圖也可看出,這是一個新生代垃圾收集器,采用的垃圾回收算法是復制算法。

  ②、單線程

  工作時只會使用一個CPU或者一條收集線程去完成工作。

  ③、進行垃圾收集時,必須暫停所有工作線程

  也就是說使用Serial收集器進行垃圾回收時,別的工作線程都暫停,系統這時候會有卡頓現象產生。

  ④、適用場景

  Serial 收集器由于沒有線程交互的開銷,對于限定單個CPU的環境,可以獲得最高的單線程收集效率。

  一般在用戶的桌面場景中,分配給虛擬機管理的內存一般來說不會很大,收集幾十兆或一兩百兆的新生代,定頓時間可以控制在幾十毫秒,只要不是頻繁發生的,這點停頓是可以接受的。

  所以 Serial 收集器對于運行在 Client 模式下的虛擬機是一種很好的選擇。

3、ParNew收集器

  這個收集器其實就是Serial收集器的多線程版本。

  也就是說其特點除了多線程,其余和Serial收集器一樣,事實上,這兩個收集器實現上也共用了很多代碼。

  ①、作用于新生代

  一個新生代垃圾收集器,采用的垃圾回收算法是復制算法。

  ②、多線程

  彌補了Serial收集器單線程的缺陷。

  ③、適用場景

  由于其多線程的特性,是大多數運行在 Server 模式下的虛擬機首選新生代垃圾收集器。

  另外需要說明的是,能夠與下面將要介紹的劃時代垃圾收集器CMS(Concurrent Mark Sweep)配合使用,也是一個重要原因。

4、Parallel Scavenge收集器

  前面介紹的垃圾收集器關注點是盡可能縮小垃圾收集時的用戶線程停頓時間。而 Parallel Scanvenge 收集器是為了達到一個可控制的吞吐量。

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

  可以用下面兩個參數進行精確控制:

  -XX:MaxGCPauseMills? 設置最大垃圾收集停頓時間

  -XX:GCTimeRatio 設置吞吐量大小

  ①、作用于新生代

  一個新生代垃圾收集器,采用的垃圾回收算法是復制算法。

  ②、多線程

  并行的多線程垃圾收集器。

  ③、吞吐量

  這個收集器可以精確控制吞吐量。

  ④、適用場景

  設置垃圾收集停頓時間短適合需要與用戶快速交互的程序;

  而設置高吞吐量可以最高效的利用CPU效率,盡快的完成程序的運算任務,主要適合在后臺運算而不需要太多交互的任務。

5、Serial Old收集器

  Serial Old 收集器是 Serial 收集器的老年代版本,特點如下:

  ①、作用于老年代

  ②、單線程

  ③、使用標記-整理算法

  ④、進行垃圾收集時,必須暫停所有工作線程

6、Parallel Old收集器

  Parallel Old 是 Parallel Scavenge收集器的老年代版本,使用多線程和“標記-整理”算法。

  ①、作用于老年代

  ②、多線程

  ③、使用標記-整理算法

  除了具有以上幾個特點,比較關鍵的是能和新生代收集器 Parallel Scavenge 配置使用,獲得吞吐量最大化的效果。

7、CMS收集器

  CMS,全稱為 Concurrent Mark Sweep ,顧名思義并發的,采用標記-清除算法。另外也將這個收集器稱為并發低延遲收集器(Concurrent Low Pause Collector)

  這是一款跨時代的垃圾收集器,真正做到了垃圾收集線程與用戶線程(基本上)同時工作。和 Serial 收集器的 Stop The World(媽媽打掃房間的時候,你不能再將垃圾丟到地上) 相比,真正做到了媽媽一邊打掃房間,你一邊丟垃圾。

  ①、作用于老年代

  ②、多線程

  ③、使用標記-清除算法

  整個算法過程分為如下 4 步:

  一、初始標記(CMS initial mark):只是僅僅標記GC Root 能夠直接關聯的對象,速度很快,但是需要“Stop The World”  

  二、并發標記(CMS concurrent mark):進行GC Root Tracing的過程,簡單來說就是遍歷Initial Marking階段標記出來的存活對象,然后繼續遞歸標記這些對象可達的對象。

  三、重新標記(CMS Remark):修正并發標記期間,因用戶程序繼續運行而導致標記產生變動的那一部分對象的標記記錄,需要“Stop The World”。這個時間一般比初始標記長,但是遠比并發標記時間短。

  四、并發清除(CMS concurrent sweep):對上一步標記的對象進行清除操作。

  由于整個過程最耗時的操作是第二(并發標記)、四步(并發清除),而這兩步垃圾收集器線程是可以和用戶線程一起工作的。所以整體來說,CMS垃圾收集和用戶線程是一起并發的執行的。

  缺點:

  ①、對CPU資源敏感

  因為在并發階段,會占用一部分CPU資源,從而導致應用程序變慢,總吞吐量會降低。

  ②、產生浮動垃圾

  由于CMS并發清理階段用戶線程還在工作,這個時候產生的垃圾,CMS無法在本次收集中處理掉它們,只能留在下一次GC時再將其處理掉,這部分垃圾稱為“浮動垃圾”。

  ③、產生內存垃圾碎片

  因為采用的算法是標記-清除,很明顯,會有空間碎片產生。

8、G1收集器

  這是當前收集器技術發展的最前沿的成果。可以實現在基本不犧牲吞吐量的前提下完成低停頓的內存回收。

  這是因為它并不像前面介紹的所有垃圾收集器是區分新生代,老年代的,它作用于全區域。將整個Java堆劃分為多個大小固定的獨立區域(Regin),并且跟蹤這些區域的垃圾堆積面積,在后臺維護一個優先級列表,每次根據允許的收集時間,優先回收垃圾最多的區域,這樣保證了G1收集器在有限的時間內可以獲得最高的收集效率。

  它與前面講的 CMS 垃圾收集器相比,有兩個顯著的改進:

  ①、采用 標記-整理 的回收算法

  這樣不會產生空間碎片

  ②、可以精確的控制停頓時間

  能讓使用者明確指定一個長度為M毫秒的時間片內,消耗在垃圾回收上的時間不超過 N 毫秒。

  ③、作用于整個Java堆

  G1收集器不區分年輕代和老年代,是整堆垃圾收集器。

9、如何選擇垃圾收集器  

  詳細文檔可以查看官方介紹,如下

  https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/collectors.html

  這里我們翻譯一下結論:

  除非應用程序有相當嚴格的暫停時間要求,否則就讓JVM自己選擇垃圾收集器。并且可以適當優先調整堆的大小來提高性能。如果還不滿足要求,則以下面四點作為指導:

  1.?如果應用程序內存小于100M,那么使用選項選擇串行收集器-XX:+UseSerialGC。

  2. 如果應用程序將在單核處理器上運行,并且沒有停頓時間的要求,選擇串行-XX:+UseSerialGC或者 JVM 自己選

  3. 如果允許停頓時間超過1秒,選擇并行或 JVM 自己選

  4.?如果響應時間比總吞吐量更重要,并且垃圾收集暫停必須保持短于大約1秒,則使用-XX:+UseConcMarkSweepGC或選擇并發收集器-XX:+UseG1GC。

10、幾個名詞解釋

  ①、并行

  指多條垃圾收集線程并行工作,但此時用戶線程仍然處于等待狀態。

  適合科學計算、后臺處理等弱交互場景。

  ②、并發

  指用戶線程與垃圾收集器線程同時執行(但不一定是并行的,可能會交替執行),用戶線程繼續執行,而垃圾收集線程運行在另一塊CPU上。

  適合對響應快速的場景,比如Web。

  ③、停頓時間

  垃圾收集器做垃圾回收中斷應用執行的時間。

  ④、吞吐量

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

轉載于:https://www.cnblogs.com/ysocean/p/11117365.html

總結

以上是生活随笔為你收集整理的Java虚拟机详解(四)------垃圾收集器的全部內容,希望文章能夠幫你解決所遇到的問題。

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