第六章 JVM垃圾收集器(2)

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

上一章記錄了幾種常見的垃圾收集器,見《第五章 JVM垃圾收集器(1)》 1、G1 說明: 從上圖來看,G1與CMS相比,僅在最後的"篩選回收"部分不同(CMS是併發清除),實際上G1回收器的整個堆記憶體的劃分都與其他收集器不同。 CMS需要配合ParNew,G1可單獨回收整個空間 原理: G1收集器將


上一章記錄了幾種常見的垃圾收集器,見《第五章 JVM垃圾收集器(1)

 

1、G1

說明:

  • 從上圖來看,G1與CMS相比,僅在最後的"篩選回收"部分不同(CMS是併發清除),實際上G1回收器的整個堆記憶體的劃分都與其他收集器不同。
  • CMS需要配合ParNew,G1可單獨回收整個空間

原理:

  • G1收集器將整個堆劃分為多個大小相等的Region
  • G1跟蹤各個region裡面的垃圾堆積的價值(回收後所獲得的空間大小以及回收所需時間長短的經驗值),在後臺維護一張優先列表,每次根據允許的收集時間,優先回收價值最大的region,這種思路:在指定的時間內,掃描部分最有價值的region(而不是掃描整個堆記憶體),並回收,做到儘可能的在有限的時間內獲取儘可能高的收集效率。

運作流程:

  • 初始標記:標記出所有與根節點直接關聯引用對象。需要STW
  • 併發標記:遍歷之前標記到的關聯節點,繼續向下標記所有存活節點。
    • 在此期間所有變化引用關係的對象,都會被記錄在Remember Set Logs中
  • 最終標記:標記在併發標記期間,新產生的垃圾。需要STW
  • 篩選回收:根據用戶指定的期望回收時間回收價值較大的對象(看"原理"第二條)。需要STW

優點:

  • 停頓時間可以預測:我們指定時間,在指定時間內只回收部分價值最大的空間,而CMS需要掃描整個年老代,無法預測停頓時間
  • 無記憶體碎片:垃圾回收後會整合空間,CMS採用"標記-清理"演算法,存在記憶體碎片
  • 篩選回收階段:
    • 由於只回收部分region,所以STW時間我們可控,所以不需要與用戶線程併發爭搶CPU資源,而CMS併發清理需要占據一部分的CPU,會降低吞吐量。
    • 由於STW,所以不會產生"浮動垃圾"(即CMS在併發清理階段產生的無法回收的垃圾)

適用範圍:

  • 追求STW短:若ParNew/CMS用的挺好,就用這個;若不符合,用G1
  • 追求吞吐量:用Parallel Scavenge/Parallel Old,而G1在吞吐量方面沒有優勢

 

2、幾點註意

問題1、G1以外的其他收集器在回收垃圾的時候:要不只是掃描年輕代,要不只是掃描年老代。在年輕代的回收過程中,如果舊生代中的對象引用了年輕代的對象,那麼我們只掃描年輕代就不行了,但是由於年老代一般而言是年輕代的3倍大小,如果年輕代、年老代一起去掃描的話,效率會急劇下降,這個問題怎麼處理?

:JVM採用remember set來做的這個事兒,當發現一個引用對象被賦值時,JVM發出一個write barrier指令來暫時中斷寫操作,檢查被賦值的引用對象是不是處於年老代,且其引用的對象是不是處於新生代(即是不是年老代對象引用了年輕代對象),如果是,將相關引用信息記錄到remember set。之後的掃描,我們會從根集合+remember set向下進行掃描。(也就是說真正的根集合,是JVM定義的根集合+remember set

 

問題2、G1收集器為了做到GC時間可預測,採用掃描部分價值最大的region來實現,那麼如果這部分region中的對象被其他region中的對象所引用,那麼僅掃描前者可能就不行了,但是如果掃描全部region的話,又無法做到GC時間可預測,效率會大大下降,怎麼辦?

:G1同理,為每一個region分配一個remember set,當發現一個引用對象被賦值時,JVM發出一個write barrier指令來暫時中斷寫操作,檢查被賦值的引用對象與其引用的對象是不是處於不同的region(eg.a=b;檢查a與b是不是在不同的region),如果是,將相關引用信息記錄到當前region的remember set。之後的掃描,我們會從根集合+remember set向下進行掃描。

 

問題3、CMS與G1在併發標記的時候若發部分引用對象的引用關係發生了變化,怎麼處理才能讓重新標記的時候僅僅掃描出這些變化?

:在併發標記期間,對象的引用關係若發生了變化,這些相關的記錄就會記錄到remember set logs在重新標記階段,將該logs的信息加入到remember set中去,然後再從remember set去向下trace節點。


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

-Advertisement-
Play Games
更多相關文章
  • 前段時間,項目中有個需求,需要將linux和windows的時間進行同步,網上也有很多類似時鐘同步的帖子,大致類似;不過本次的linux的機器有點特殊,沒有service命令,而且要求在另一臺suse的linux機器上通過腳本連接到目的linux機器進行時鐘同步。起先我也被困擾的很久,不過辦法都是人
  • 類的繼承,是在父類中存在可繼承的成員A,而在子類中不存在同名成員,這樣該成員會被繼承到子類,當子類對象訪問該成員時,實際訪問的是父類的對應成員。類的重寫,是在父類中存在可繼承的成員A,而在子類中存在同名成員,這樣該成員會被子類重寫,當子類對象訪問該成員時,實際訪問的是子類的成員。所以二者的區別就是,
  • 在節前的最後一天,解決了打包過程中遇到的所有問題,可以成功運行了!真是個好彩頭,希望新的一年一切順利! 以下是在使用cx_freeze過程中遇到的問題及解決辦法(Win7) 問題描述:運行exe,啟動無數個主程式,導致系統無法使用 原因:在程式中使用了multiprocessing的包 解決辦法:在
  • package CommonClassPart; import java.io.File; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class Common
  • /*漢諾塔的玩法: * 游戲的規則:將A柱上的盤子移動到C柱上,大盤必須在小盤之上。 * 1 當A柱上只有一個盤子的時候,直接移動到C柱上; * 2 當A柱上有兩個盤子的時候, * 將A柱上的1盤(從上到下編號)移動到B柱, * 將A柱上的2盤移動到C柱, * 將B柱上的1盤移動到C柱; * (將A
  • 本文實例講述了PHP限制HTML內容中圖片必須是本站的方法。分享給大家供大家參考。具體實現方法如下: 1. PHP代碼如下: <?php $dom = new DOMDocument; $dom->loadHTML(file_get_contents('input.html')); $xpath =
  • java magic翻譯系列文章,java小伙伴不知道的奇妙世界
  • package CollectionPart; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class CollectionSort { public static v
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...