1. 程式人生 > >從萌新的角度理解垃圾收集器

從萌新的角度理解垃圾收集器

從萌新的角度理解記憶體回收一文,詳細的描述了記憶體回收(又稱垃圾收集)涉及的相關方法論。垃圾收集器就是依據記憶體回收方法論的具體實現。本文簡單介紹JVM中主要的垃圾收集器。下面主要看一張圖。
垃圾收集器
在上圖中,列舉了七種不同的垃圾收集器,每個垃圾收集器複雜回收的記憶體區域不一樣,且存在搭配關係。 Serial, ParNew, Parallel Scavenge這三個垃圾收集器負責回收堆區的新生代。CMS, Serial Old,Parallel Old負責回收堆區的老年代。G1垃圾回收器是目前最為先進的垃圾回收器,既能收回新生代又能回收老年代。上述垃圾回收器之間的搭配關係是通過藍色實線表達,比如新生代若採用Serial,那麼老年代只能採用CMS或者Serial Old與之配對。圖中紅色虛線不代表搭配關係,後文中會詳細接收

  • Serial 垃圾回收器
    Serial垃圾收集器,主要有以下幾個我們需要知道的內容:
    (1) Serial 採用標記-複製演算法進行垃圾回收
    (2) Serial 只有一個執行緒進行垃圾回收操作,不是多執行緒
    (3) Serial 在進行垃圾回收時,會暫停其他所有的工作執行緒,專心進行垃圾回收,這種暫停工作執行緒的現象,稱為stop all word。
    (4) Serail 是最早也是最古老的垃圾回收器,是JVM工作在client模式下新生代預設選擇的垃圾回收器。

  • Serial old 垃圾回收器
    從名字可見一般,Serial Old垃圾收集器和Serial垃圾收集器最大的不同之處在於。其採用標記-整理的記憶體回收方法,而不是標記-複製演算法

    ,其也是單執行緒垃圾回收,垃圾回收時同樣需要暫停其他工作執行緒。

  • ParNew 垃圾回收器
    ParNew是Serial垃圾回收器的多執行緒版本,其具有多個垃圾回收執行緒,而不是單執行緒。其他的比如,收集演算法,stop all word,物件分配規則等和Serial垃圾回收器完全一致。

  • Parallel Scavenge
    該垃圾回收器是有多執行緒的垃圾回收,也是採用標記-複製演算法的新生代垃圾回收執行緒,看上去和ParNew並不太大的區別。但是他們設計追求的目標並不一樣,Parallel Scavenge最求最大的吞吐量為目標,即追求CPU執行目的碼的時間竟可能多佔CPU總執行時間。其他的垃圾回收器是追求儘可能端的stop all word時間。

    從這一點看來,面向運算的後臺任務,比較適合Paralle Scavenge,面向互動式的任務,追求最短的停頓時間,顯然Parallel Scavenge不適合。

  • CMS(Concurrent mark sweep)垃圾回收器
    該款垃圾回收器,是jdk1.5推出的一款具有里程碑意思的垃圾回收器。其面向強互動式應用,具有極短的stop all world 時間,幾乎能夠保證使用者執行緒和垃圾回收執行緒同時工作。該垃圾收集器採用標記-清除演算法,其整個的回收過程比上述垃圾回收器複雜,其可以分為四個階段:
    (1)初始標記
    初始標記,主要是比較GCROOT直接關聯的物件,這個過程比較快,好時段,需要stop all word,垃圾回收執行緒和使用者執行緒不能同時工作。
    (2)併發標記
    該過程是GCROOT Tracing 過程,跟蹤GCROOT能夠引用的所有節點,該過程比較耗時,允許垃圾回收執行緒和使用者執行緒同時工作
    (3)重新比較
    重新比較過程,是一個標定過程,在併發標記過程中,對使用者執行緒更改的一些引用關係進行重新標記。該過程用時比較短,需要stop all world,不支援垃圾回收執行緒和使用者執行緒同時工作
    (4)併發清除
    該過程,就是清理標記物件的過程,該過程允許垃圾回收執行緒和使用者執行緒同時工作,耗時比較長。
    在上述的四個階段中,耗時標記長的併發標記過程,以及併發清除過程都是允許垃圾回收執行緒和使用者執行緒同時工作的,因此從總體上來看,CMS的垃圾回收執行緒允許使用者執行緒和垃圾回收執行緒同時工作,具有強實時互動能力。
    特別注意: 使用者執行緒和垃圾回收執行緒同時執行的話,那麼在垃圾過程時,標配需要預留一步空間給使用者執行緒支援,不能等到記憶體空間耗盡時,才進行垃圾回收。在jdk1.6中,設定記憶體資源使用92%時執行垃圾回收。如若在垃圾回收過程中,預留的記憶體空間無法滿足使用者執行緒的記憶體需求,則會報出Cocurrent mode failue 失敗資訊,此時老年代採用 serial old 代替CMS執行垃圾收集,這就是文中首圖中紅色虛線的意義

  • G1垃圾收集器
    G1收集器是目前為止最為先進的垃圾收集器,其設計目標就是在未來替代CMS垃圾收集器,其也是多線執行緒垃圾收集,並且追求極短的stop all world時間,同樣是分代收集策略,採用標記-整理演算法。其最大效能優越之處在於,其擁有可預測停頓能力。其建立了可預測時間停頓模型。其能讓使用者指定一具體時間,在這段時間內保證完成垃圾收集動作,具有實時垃圾收集器的特徵
    G1垃圾收集器的回收方法這CMS具有很大不同,本文中並無詳細討論G1更具體細節,只粗粒度的介紹下垃圾回收器G1的細分過程,詳細請參閱深入理解java虛擬機器-JVM高階特性與最佳實踐,其細分過程
    (1) 初始標記
    (2) 併發標記
    (3) 最終標記
    (4) 篩選回收
    從上述過程名來看,其細分過程和CMS的細分過程幾乎一樣,每個過程的邏輯效果也是大致相同,只是採用的具體實現方法不同。初始標記過程和最終標機過程耗時較短,是需要stop all world。併發標機和篩選回收過程耗時較長,不需stop all world。

相關推薦

角度理解垃圾收集

從萌新的角度理解記憶體回收一文,詳細的描述了記憶體回收(又稱垃圾收集)涉及的相關方法論。垃圾收集器就是依據記憶體回收方法論的具體實現。本文簡單介紹JVM中主要的垃圾收集器。下面主要看一張圖。 在上圖中,列舉了七種不同的垃圾收集器,每個垃圾收集器複雜回收的記

角度理解Mysql索引基本原理

本文是針對Mysql索引原理剖析的入門級文章,主要圍繞以下四個話題展開對索引相關原理的描述。 一丶索引基本概念 二丶(B+)-Tree索引基本實現 三丶關於Mysql索引常見術語解疑(聚族索引,非聚族索引,最左字首原則, 索引覆蓋,雜湊索引,自適應雜湊索引) 四丶索引侷限性 ####一丶索

角度理解Http協議(一)之互動流程

HTTP協議,是構建Web世界的基石技術,HTTP協議應是軟體開發者必備的知識儲備。本文是介紹HTTP協議的入門級文章。 通過在瀏覽器輸入網址這個簡單的案例來介紹Http協議的互動流程。文字介紹互動流程包括兩個方面: 客戶端和服務端的互動 HTTP半雙工通

深入理解JVM:垃圾收集與內存分配策略

四種 內存回收 第一次 不可達 append test 方法 static hot 堆裏面存放著Java世界差點兒全部的對象實例,垃圾收集器在對堆進行回收前。第一件事情就是要確定這些對象之中哪些還存活,哪些已經死去。推斷對象的生命周期是否結束有下面幾種方

垃圾收集與內存分配策略 (深入理解JVM二)

nali noclass eth 清理 full gc 原因 商業 jit編譯器 代碼 1.概述 垃圾收集(Garbage Collection,GC). 當需要排查各種內存溢出、內存泄露問題時,當垃圾收集成為系統達到更高並發量的瓶頸時,我們就需要對這些&ldquo

轉:深入理解Java G1垃圾收集

線程數 hot 原因 重要 特性 賦值 圖標 參數 堆內存 java垃圾收集器的歷史 第一階段,Serial(串行)收集器 在jdk1.3.1之前,java虛擬機僅僅能使用Serial收集器。 Serial收集器是一個單線程的收集器,但它的“單線程”的意義並不僅僅是說明它只

深入理解java虛擬機---垃圾收集和分配策略-1

public 空間 說明 java ref 方法 虛引用 頻繁 print 博文重點:     學習目標:哪些內存需要回收          什麽時候回收          如何回收     在基於概念討論的模型中,主要對Java堆和方法區進行討論。     why?

《深入理解Java虛擬機》——垃圾收集與內存分配策略

特點 兩個 instance 統一 tro 過程 引用計數 分析算法 效率問題 GC需要完成: 哪些內存需要回收 什麽時候回收 如何回收 如何確定對象不再使用 引用計數算法 給對象添加一個引用計數器,當有一個地方引用它時,計數器值進行加1操作;當引用失效時,計數器值

JVM理論:(二/4)理解GC日誌、垃圾收集參數總結

相關 serial inf 說明 test 日誌 虛擬機啟動 cool 收集 JVM的GC日誌的主要參數包括如下幾個: -XX:+PrintGC 輸出GC日誌 -XX:+PrintGCDetails 輸出GC的詳細日誌 -XX:+PrintGCTimeStamps 輸出GC

深入理解jvm虛擬機讀書筆記-垃圾收集與內存分配策略(二)

具體實現 地方 比例 並發 解決 垃圾收集 替換 map 而是 垃圾收集算法-標記清除算法 標記清除算法是最基礎的收集算法。算法分為“標記”和“清楚”兩個階段:首先標記出所有需要回收的對象,在標記過程完成後統一回收所有被標記的對象。後續的收集算法都是基於這種思路對其不足進行

《深入理解Java虛擬機》學習筆記(第三章 垃圾收集與內存分配策略)

關鍵字 rem 永久 規模 是把 同時 技術 source () 第三章 垃圾收集器與內存分配策略 要解決的問題 哪些內存需要回收? 什麽時候回收? 如何回收? 概述 當需要排查各種內存溢出、內存泄漏問題時,當垃圾收集成為系統達到更高並發量的瓶頸時, 需要對內存動態分

深入理解Java虛擬機器總結一垃圾收集與記憶體分配策略(二)

深入理解Java虛擬機器總結一垃圾收集器與記憶體分配策略(二) 垃圾回收概述 如何判定物件為垃圾物件 垃圾回收演算法 垃圾收集器詳解 記憶體分配策略 垃圾回收概述 如何判定物件為垃圾物件 引用計數法: 在物件

深入理解JVM——7種垃圾收集

轉自:https://crowhawk.github.io/2017/08/15/jvm_3/ 如果說收集演算法是記憶體回收的方法論,那麼垃圾收 集器就是記憶體回收的具體實現。Java虛擬機器規範中對垃圾收集器應該如何實現並沒有任何規定,因此不同的廠商、版本的虛擬機器所提供的垃圾收集器都可能

jvm垃圾收集理解

1、java執行時區域 執行時區域分為 兩類:執行緒私有和執行緒共享。 執行緒私有 程式計數器: 當前執行緒所執行的行號指令器。Java虛擬機器的多執行緒是通過執行緒輪流切換並配置處理執行時間的方式來實現的,在同一個時刻,cpu只能執行一個執行緒

深入理解JVM之GC演算法與垃圾收集[轉]

概述 說起垃圾收集(Grabage Collection,GC),我們需要考慮GC需要完成的三件事情: 哪些記憶體需要回收? 什麼時候回收? 如何回收? 為什麼我們要求瞭解GC呢和記憶體分配呢?答案很簡單:當需要排查各種記憶體溢位、記憶體洩露問題時,當垃圾收整合為系

《深入理解java虛擬機器》讀書筆記(三)---- 垃圾回收演算法及垃圾收集介紹

一、垃圾回收演算法 1、標記--清除演算法 標記--清除(Mark-Sweep)演算法,分為標記和清除兩個階段,首先標記出所有需要回收的物件,在標記完成後統一回收所有被標記的物件,這是最基礎的收集演算法,後續很多演算法都是基於這種思想進行設計的。 標記--清除演算法主要的不足有兩點:一個

深入理解JVM(3)-7種垃圾收集(轉)

**如果說收集演算法是記憶體回收的方法論,那麼垃圾收集器就是記憶體回收的具體實現。**Java虛擬機器規範中對垃圾收集器應該如何實現並沒有任何規定,因此不同的廠商、 版本的虛擬機器所提供的垃圾收集器都可能會有很大差別,並且一般都會提供引數供使用者根據自己的應用特點和要求組合出各個年代所使用的

深入理解JVM之垃圾收集

垃圾收集器 書到用時方恨少,事非經過不知難!本文參考《深入理解JVM》周至明著。由於寫作水平和寫作時間有限,本中存在不妥之處,還請大家多多留言。 判定物件死亡 引用計數演算法 思想:建立物件時並給其新增一個引用計數器,當某一地方引用它時,計數器值+1,當引用失效時

讀書筆記 ---- 《深入理解Java虛擬機器》---- 第3篇:垃圾收集

上一篇:垃圾回收演算法:https://blog.csdn.net/pcwl1206/article/details/84061589 本篇文章轉發自:https://blog.csdn.net/chjttony/article/details/7883748 第3篇:垃圾收集器 1&n

深入理解jvm(二、常用的垃圾收集

1.Serial 單執行緒收集器,它在進行垃圾收集時必須暫停其他工作執行緒,直到收集結束。是虛擬機器執行在客戶端下的預設新生代收集器。 相對於其他收集器的單執行緒來說,簡單高效。 2.ParNew 相當於Serial收集器的多執行緒版本,一般是執行在服務端的虛擬機器首選的新生代收集器