1. 程式人生 > >第六章 JVM垃圾收集器(2)

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

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節點。

相關推薦

JVM垃圾收集2

1、G1 說明: 從上圖來看,G1與CMS相比,僅在最後的"篩選回收"部分不同(CMS是併發清除),實際上G1回收器的整個堆記憶體的劃分都與其他收集器不同。 CMS需要配合ParNew,G1可單獨回收整個空間 原理: G1收集器將整個堆劃分為多個大小相等的Region G1

JVM垃圾收集1

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

JVM垃圾收集2

此文已由作者趙計剛薪授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 1、G1 說明: 從上圖來看,G1與CMS相比,僅在最後的"篩選回收"部分不同(CMS是併發清除),實際上G1回收器的整個堆記憶體的劃分都與其他收集器不同。 CMS需要配合Pa

JVM垃圾收集 —— 預設的垃圾收集

在前面的幾篇文章講述了各種垃圾收集器,但是問題來了,我們在Linux或者Windows安裝的 jdk 預設是什麼收集器呢? 開啟控制檯,在控制檯中輸入一下命令: java -XX:+PrintCommandLineFlags -version 32位的windo

JVM垃圾收集 —— 老年代垃圾收集

上一篇文章講了新生代的垃圾收集器,這篇文章我們來講講老年代的垃圾收集器 Serial Old收集器 1、說明:一個單執行緒收集器,使用“標記-整理”演算法。其實就是Serial收集器老年代的版本 2、優缺點 和 執行圖 和Serial收集器一樣,所以這裡就不多贅

JVM垃圾收集 —— 概念:新生代和老年代、並行和併發

在上篇文章中我們講到了垃圾回收的幾種演算法。垃圾收集演算法是記憶體回收的方法論,而垃圾收集器是垃圾回收的具體實現。 在瞭解垃圾收集器之前,本篇文章先來簡單的說一下新生代和老年代、並行和併發的概念。 新生代和老年代 從記憶體回收的角度來看,一般我們可以將Java堆分

JVM - 垃圾收集

HotSpot虛擬機器垃圾收集器的種類以及作用空間(連線表示兩個收集器可以搭配使用) Serial 收集器:該收集器單執行緒工作,在gc時暫停使用者其他所有的工作執行緒即“Stop The World”,新生代採用複製演算法,老年代採用 標記-整理 演算法,是虛擬機器執行在Client模式

JVM垃圾收集1

ads vivo 計算 square 算法 round 兩種 多線程 lin 此文已由作者趙計剛薪授權網易雲社區發布。歡迎訪問網易雲社區,了解更多網易技術產品運營經驗。說明:垃圾回收算法是理論,垃圾收集器是回收算法的實現,關於回收算法,見《第四章 JVM垃圾回收算法》1、七

深入理解JVM垃圾收集與記憶體分配策略

概述 對於Java記憶體執行時區域的各位部分,其中程式計數器、虛擬機器棧、本地方法棧這三個區域都是隨執行緒而生,隨執行緒而滅。並且棧幀中分配的記憶體也是在編譯後就已知的。因此這幾個區域的記憶體分配和回收都具備確定性,所以我們在這幾個區域就不必過多地考慮

詳解JVM垃圾收集演算法&垃圾收集圖解

垃圾收集演算法:記憶體回收的方法論 垃圾收集器:記憶體回收的具體實現 在正式討論垃圾回收演算法和垃圾收集器之前,我們應該瞭解一下JVM是如何判斷一個物件已經死亡的? JVM主要使用了兩種方法判斷物件是否已經死亡:

JVM初窺:垃圾收集

參考書籍:《深入理解Java虛擬機器——JVM高階特性與最佳實踐(第2版)》 Java語言出來之前,程式開發更多的是使用C或者C++語言,然而在C或者C++語言中存在一個很大的矛盾:建立物件時要不斷

:循環結構

結構 不執行 三種 表達式 成了 不改變 條件 運算符 步驟 第六章:循環結構(二) 一. for 循環 1.循環結構的四個組成部分 (1). 初始部分:設置循環的初始狀態,比如我們設置記錄循環次數的變量 i 為 0 . (2). 循環體:重復執行的代碼 .

6 征服CSS3選擇

屬性選擇器 在HTML中,通過各種各樣的屬性可以給元素增加很多附加的資訊。例如,通過id屬性可以將不同div元素進行區分。 在CSS2中引入了一些屬性選擇器,而CSS3在CSS2的基礎上對屬性選擇器進行了擴充套件,新增了3個屬性選擇器,使得屬性選擇器有了萬用字元的概念,這三個屬性選擇器與CSS2的屬性選擇器

7 征服CSS3選擇

:enabled選擇器 在Web的表單中,有些表單元素有可用(“:enabled”)和不可用(“:disabled”)狀態,比如輸入框,密碼框,複選框等。在預設情況之下,這些表單元素都處在可用狀態。那麼我們可以通過偽選擇器“:enabled”對這些表單元素設定樣式。 示例演示 通過“:enabled”選擇器

深入理解JVM——垃圾回收

深入理解JVM(五)——垃圾回收器 JVM的垃圾回收主要是針對以上堆空間的垃圾回收,當然其實也會針對元資料區(永久區)進行垃圾回收。 序列收集器 使用單執行緒進行垃圾回收。 對新生代回收使用複製演算法, 對老年代使用標記壓縮演算法, 最古老最穩定

Realm及相關物件 PrincipalCollection

之前使用過的(來點印象) login("classpath:shiro-authenticator-all-success.ini"); Subject subject = SecurityUtils.getSubject(); //得到一個身份集合,其包含了Realm

高等數學: 定積分的應用1定積分的應用 平面圖形的面積 立體體積

§6.1  定積分的元素法 一 再論曲邊梯形面積計算 設在區間上連續,且,求以曲線為曲邊,底為的曲邊梯形的面積。 1、化整為零 用任意一組分點   將區間分成 個小區間,其長度為 並記  相應地,曲邊梯形被劃分成個窄曲邊梯形,第個窄曲邊梯形的面積記為。 於是   2、以

垃圾收集演算法實現與垃圾收集筆記

一、HotSpot中垃圾收集的演算法實現 1、列舉根節點 1.1、從可達性分析中從GC Roots節點找引用鏈這個操作為例,可作為GC Roots的節點主要在全域性性的引用(例如常量和類靜態屬性)與執行上下文(例如棧幀中的本地變量表)中,現在很多應用僅僅方法區就有數百兆,

併發垃圾收集CMS為什麼沒有采用標記-整理演算法來實現?

併發垃圾收集器(CMS)為什麼沒有采用標記整理-演算法來實現,而是採用的標記-清除演算法?分代式GC裡,年老代常用mark-sweep;或者是mark-sweep/mark-compact的混合方式,一般情況下用mark-sweep,統計估算碎片量達到一定程度時用mark-c

Realm及相關物件 AuthorizationInfo

AuthorizationInfo用於聚合授權資訊的: public interface AuthorizationInfo extends Serializable { Collection<String> getRoles(); //獲取角色字串資訊