第五章 JVM垃圾收集器(1)

来源:http://www.cnblogs.com/java-zhao/archive/2016/02/05/5183670.html
-Advertisement-
Play Games

說明:垃圾回收演算法是理論,垃圾收集器是回收演算法的實現,關於回收演算法,見《第四章 JVM垃圾回收演算法》 1、七種垃圾收集器 Serial(串列GC) ParNew(並行GC) Parallel Scavenge(並行回收GC) Serial Old(MSC)(串列GC) CMS(併發GC) Paral


說明:垃圾回收演算法是理論,垃圾收集器是回收演算法的實現,關於回收演算法,見《第四章 JVM垃圾回收演算法

1、七種垃圾收集器

  • Serial(串列GC)
  • ParNew(並行GC)
  • Parallel Scavenge(並行回收GC)
  • Serial Old(MSC)(串列GC)
  • CMS(併發GC)
  • Parallel Old(並行GC)
  • G1(JDK1.7update14才可以正式商用)

說明:

  • 1~3用於年輕代垃圾回收:年輕代的垃圾回收稱為minor GC
  • 4~6用於年老代垃圾回收(當然也可以用於方法區的回收):年老代的垃圾回收稱為full GC
  • G1獨立完成"分代垃圾回收"

註意:並行與併發

  • 並行:多條垃圾回收線程同時操作
  • 併發:垃圾回收線程與用戶線程一起操作

 

2、常用五種組合

  • Serial/Serial Old
  • ParNew/Serial Old:與上邊相比,只是比年輕代多了多線程垃圾回收而已
  • ParNew/CMS:當下比較高效的組合
  • Parallel Scavenge/Parallel Old:自動管理的組合
  • G1:最先進的收集器,但是需要JDK1.7update14以上

 

2.1、Serial/Serial Old:

特點:

  • 年輕代Serial收集器採用單個GC線程實現"複製"演算法(包括掃描、複製)
  • 年老代Serial Old收集器採用單個GC線程實現"標記-整理"演算法
  • Serial與Serial Old都會暫停所有用戶線程(即STW)

說明:

  • STW(stop the world):編譯代碼時為每一個方法註入safepoint(方法中迴圈結束的點、方法執行結束的點),在暫停應用時,需要等待所有的用戶線程進入safepoint,之後暫停所有線程,然後進行垃圾回收。

適用場合:

  • CPU核數<2,物理記憶體<2G的機器(簡單來講,單CPU,新生代空間較小且對STW時間要求不高的情況下使用)
  • -XX:UseSerialGC:強制使用該GC組合
  • -XX:PrintGCApplicationStoppedTime:查看STW時間

 

2.2、ParNew/Serial Old:

說明:

  • ParNew除了採用多GC線程來實現複製演算法以外,其他都與Serial一樣,但是此組合中的Serial Old又是一個單GC線程,所以該組合是一個比較尷尬的組合,在單CPU情況下沒有Serial/Serial Old速度快(因為ParNew多線程需要切換),在多CPU情況下又沒有之後的三種組合快(因為Serial Old是單GC線程),所以使用其實不多。
  • -XX:ParallelGCThreads:指定ParNew GC線程的數量,預設與CPU核數相同,該參數在於CMS GC組合時,也可能會用到

 

2.3、Parallel Scavenge/Parallel Old:

特點:

  • 年輕代Parallel Scavenge收集器採用多個GC線程實現"複製"演算法(包括掃描、複製)
  • 年老代Parallel Old收集器採用多個GC線程實現"標記-整理"演算法
  • Parallel Scavenge與Parallel Old都會暫停所有用戶線程(即STW)

說明:

  •  吞吐量:CPU運行代碼時間/(CPU運行代碼時間+GC時間)
  • CMS主要註重STW的縮短(該時間越短,用戶體驗越好,所以主要用於處理很多的交互任務的情況)
  • Parallel Scavenge/Parallel Old主要註重吞吐量(吞吐量越大,說明CPU利用率越高,所以主要用於處理很多的CPU計算任務而用戶交互任務較少的情況

參數設置:

  • -XX:+UseParallelOldGC:使用該GC組合
  • -XX:GCTimeRatio:直接設置吞吐量大小,假設設為19,則允許的最大GC時間占總時間的1/(1+19),預設值為99,即1/(1+99)
  • -XX:MaxGCPauseMillis:最大GC停頓時間,該參數並非越小越好
  • -XX:+UseAdaptiveSizePolicy:開啟該參數,-Xmn/-XX:SurvivorRatio/-XX:PretenureSizeThreshold這些參數就不起作用了,虛擬機會自動收集監控信息,動態調整這些參數以提供最合適的的停頓時間或者最大的吞吐量(GC自適應調節策略),而我們需要設置的就是-Xmx,-XX:+UseParallelOldGC或-XX:GCTimeRatio兩個參數就好(當然-Xms也指定上與-Xmx相同就好)

註意:

  • -XX:GCTimeRatio和-XX:MaxGCPauseMillis設置一個就好
  • 不開啟-XX:+UseAdaptiveSizePolicy,-Xmn/-XX:SurvivorRatio/-XX:PretenureSizeThreshold這些參數依舊可以配置,以resin伺服器為例
                <jvm-arg>-Xms2048m</jvm-arg>
                <jvm-arg>-Xmx2048m</jvm-arg>
                <jvm-arg>-Xmn512m</jvm-arg>
                <jvm-arg>-Xss1m</jvm-arg>
                <jvm-arg>-XX:PermSize=256M</jvm-arg>
                <jvm-arg>-XX:MaxPermSize=256M</jvm-arg>
                <jvm-arg>-XX:SurvivorRatio=8</jvm-arg>
                <jvm-arg>-XX:MaxTenuringThreshold=15</jvm-arg>
    
                <jvm-arg>-XX:+UseParallelOldGC</jvm-arg>
                <jvm-arg>-XX:GCTimeRatio=19</jvm-arg>
    
                <jvm-arg>-XX:+PrintGCDetails</jvm-arg>
                <jvm-arg>-XX:+PrintGCTimeStamps</jvm-arg>
    View Code

適用場合:

  • 很多的CPU計算任務而用戶交互任務較少的情況
  • 不想自己去過多的關註GC參數,想讓虛擬機自己進行調優工作

 

2.4、ParNew/CMS

說明:

  • 以上只是年老代CMS收集的過程,年輕代ParNew看"2.2、ParNew/Serial Old"就好
  • CMS是多回收線程的,不要被上圖誤導,預設的線程數:(CPU數量+3)/4
  • CMS主要註重STW的縮短(該時間越短,用戶體驗越好,所以主要用於處理很多的交互任務的情況)

特點:

  • 年輕代ParNew收集器採用多個GC線程實現"複製"演算法(包括掃描、複製)
  • 年老代CMS收集器採用多線程實現"標記-整理"演算法
    • 初始標記:標記與根集合節點直接關聯的節點。時間非常短,需要STW
    • 併發標記:遍歷之前標記到的關聯節點,繼續向下標記所有存活節點。時間較長。
    • 重新標記:重新遍歷trace併發期間修改過的引用關係對象。時間介於初始標記與併發標記之間,通常不會很長。需要STW
    • 併發清理:直接清除非存活對象,清理之後,將該線程占用的CPU切換給用戶線程
  • 初始標記與重新標記都會暫停所有用戶線程(即STW),但是時間較短;併發標記與併發清理時間較長,但是不需要STW

關於併發標記期間怎樣記錄發生變動的引用關係對象,在重新標記期間怎樣掃描這些對象,見《第六章 JVM垃圾收集器(2)

缺點:

  • 併發標記與併發清理:按照說明的第二點來講,假設有2個CPU,那麼其中有一個CPU會用於垃圾回收,而另一個用於用戶線程,這樣的話,之前是兩CPU運行用戶線程,現在是一個,那麼效率就會急劇下降。也就是說,降低了吞吐量(即降低了CPU使用率)。
  • 併發清理:在這一過程中,產生的垃圾無法被清理(因為發生在重新標記之後)
  • 併發標記與併發清理:由於是與用戶線程併發的,所以用戶線程可能會分配對象,這樣既可能對象直接進入年老代(例如,大對象),也可能進入年輕代後,年輕代發生minor GC,這樣的話,實際上要求我們的年老代需要預留一定空間,也就是說要在年老代還有一定空間的情況下就要進行垃圾回收,留出一定記憶體空間來供其他線程使用,而不能等到年老代快爆滿了才進行垃圾回收,通過-XX:CMSInitiatingOccupancyFraction來指定當年老代空間滿了多少後進行垃圾回收(jdk1.6預設是92%)
  • 標記-清理演算法:會產生記憶體碎片,由於是在老年代,可能會提前觸發Full GC(這正是我們要儘量減少的)

參數設置:

  • -XX:+UseConcMarkSweepGC:使用該GC組合
  • -XX:CMSInitiatingOccupancyFraction:指定當年老代空間滿了多少後進行垃圾回收(jdk1.6預設是92%)
  • -XX:+UseCMSCompactAtFullCollection:(預設是開啟的)在CMS收集器頂不住要進行FullGC時開啟記憶體碎片整理過程,該過程需要STW
  • -XX:CMSFullGCsBeforeCompaction:指定多少次FullGC後才進行整理
  • -XX:ParallelCMSThreads:指定CMS回收線程的數量,預設為:(CPU數量+3)/4

適用場合:

  • 用於處理很多的交互任務的情況
  • 方法區的回收一般使用CMS,配置兩個參數:-XX:+CMSPermGenSweepingEnabled與-XX:+CMSClassUnloadingEnabled

 

3、一些經驗

  • 由於當下大型企業用的比較多的還是jdk1.6版本,所以G1用的還是不多
  • 用得最多的兩種:ParNew/CMS和Parallel Scavenge/Parallel Old
  • Full GC的四種情況
    • 舊生代空間不足
      • 不要創建過大的對象獲數組
      • 儘量讓對象在minor GC被回收
      • 讓對象在年輕代多存活一段時間,可能這段時間內就會被minor GC回收
    • 方法區滿了
      • 增大方法區
      • 使用CMS GC回收方法區
    • CMS GC中promotion failed(minor GC時,survivor區放不下,年老區也放不下)和concurrent mode failure
      • 增大survivor區
      • 增大年老區
      • 調低-XX:CMSInitiatingOccupancyFraction
      • 設置:-XX:CMSMaxAbortablePrecleanTime=5(單位:ms),防止CMS在重新標記很久後才進行併發清理
    • 空間擔保機制(這一塊兒見《深入理解Java虛擬機(第二版)》P98)

附:具體的配置參數查看《深入理解Java虛擬機(第二版)》P90


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前就是說過“一個項目有很多重要的步驟以及功能”,那我們現在就來看看對於KTV項目來說;後臺是處於什麼樣的重要作用! 首先就得瞭解KTV後臺的一些功能了: 1.歌曲管理 、歌手管理 、設置資源路徑 2.新增歌手、歌手查詢、新增歌曲、歌曲查詢、更改歌曲路徑以及退出點歌系統 一.後臺登錄界面 01.判斷
  • 這裡是簡要的一些微信支付,公眾號支付的一些流程,包括以下配置信息,錯誤信息等,並不全面,但是希望能夠幫助到大家,不喜勿噴,我也是新手,也當是給自己寫了一個筆記,加深一下影響,以後再遇到,也能方便自己的學習
  • 本篇文章的主旨是使用 .NET/C# 實現 TCP 高性能服務的不同方式,包括但不限於如下內容:APM 方式,即 Asynchronous Programming Model;TAP 方式,即 Task-based Asynchronous Pattern;SAEA 方式,即 SocketAsync...
  • 集合概述 集合簡單的說就是數組的升級版。他可以動態的對集合的長度(也就是集合內最大元素的個數)進行定義和維護! ArrayList ArrayList非常類似於數組。也有人稱他為數組列表,它的容量可以根據需要進行動態擴充,而它的索引也會根據集合容量的擴展而重新分配和調整。也就是說ArrayList集...
  • ASP.NET使用StructureMap等依賴註入組件時最重要就是EntityFramework的DbContext對象要保證在每次HttpRequest只有一個DbContext實例,這裡將使用第三方提供的HttpSimulator進行測試。 1.定義IDependency介面 創建屏蔽不同依賴
  • 由快速排序引發對Java方法參數的思考
  • 一、三元運算 我們在上章學習的if,,else,,有一種簡便的方法 他的表達式是這樣的:變數 = 值1 if 條件 else 值2 解釋過來就是如果aaa等於sss則輸出值1否則輸出值2 二、類的概念 類是面向對象編程的核心, 它扮演相關數據及邏輯的容器角色。它們提供了創建“真實” 對象(也就是實例
  • 練習: 輸入詩的名稱查詢出詩的內容,當輸入exit時,退出程式,“春曉”,“靜夜思”,“鵝”。 package CollectionPart; public class Poetry { private String title; private String poet; private Strin
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...