1. 程式人生 > >(5) Java GC演算法及種類

(5) Java GC演算法及種類

GC演算法主要有以下三種方法(都是以GC Roots可達性為依據,引用計數演算法實現簡單,但由於存在迴圈引用問題,故已不採用,詳見:Java GC(概述)

(1).複製收集演算法

針對Young區,依次掃描這個區的所有可達物件(如何確定可達物件,請參考前一節),掃描只掃描GC維護的一張物件關係有向圖(以下稱為可達物件鏈),只要在這個圖上的,就將這個物件複製到另一個區域(實現這種演算法需要堆記憶體保留一個與Young區大小一樣的區域),原先的Eden區物件,移到From區,From區移到To區,有必要的話,將物件移到Old區(區域劃分,見Java記憶體結構),原先記憶體全部清空,作為下一次GC用。


優缺點:只需遍歷可達的物件,不用訪問不可達物件,遍歷少,但需要巨大的複製成本和較多的記憶體。

(2).標記清除演算法

遍歷可達物件鏈,對這些物件進行標記,下次,遍歷整個區域的物件,沒有標記的清除。

優缺點:不需要額外空間,但是遍歷空間花費大,而且會產生大量記憶體碎片

(3).標記整理演算法

前二者的結合,遍歷可達物件鏈,標記這些物件,再按順序將這些物件合併到一塊記憶體上,比如,有1、2、3、4、5、6、7、8塊連續記憶體物件,其中2,5,8是可達鏈上物件,標記整理演算法的做法是:先標記他們,再從1開始遍歷,1不是,到2,2是,將2複製到1,2標記清除,再遍歷3,4,不是,遍歷5,是,將5複製到2,依次如此,最後得到1,2,3有用記憶體,後面記憶體就被清除了。

優缺點:相對標記清除來說,沒有了記憶體碎片,但是遍歷花費仍然很大。

實際上,GC根據堆記憶體空間不同區域,採用不同的演算法回收:

Young區:存活的物件較少,複製代價小,但次數多,採用複製收集演算法;

Old區和方法區:物件存活較多,次數少,較慢,採用標記清除或標記整理演算法。

以上,是GC的具體演算法,即回收記憶體的做法,GC回收器種類實現上也有很多種。

再說明各種GC回收器之前,先說明下GC回收器的衡量指標:

1.Throughput(吞吐量):所有沒有花在執行GC上的時間佔總執行時間的比重。

2.Pauses(暫停):當GC在執行時程式的暫停次數。或者是在感興趣的暫停次數中,暫停的平均時長和最大時長。

3.Footprint(足跡?):當前使用的堆記憶體大小(演算法所有花費的額外空間)。

4.Promptness(及時性):不再使用的物件多久能被清除掉並釋放其記憶體。

(1).序列垃圾回收器

GC執行緒只有一個,它會暫停所有工作執行緒,一個一個記憶體區域來收集,不適合伺服器環境。通過JVM命令-XX:+UseSerialGC可以使用序列垃圾回收器。序列回收器也有兩種:1.Serial:只對新生代使用;2.Serial Old:只對老年代使用,採用的演算法不一樣(一般作為CMS的替補)

(2).並行垃圾回收器

GC使用多執行緒進行垃圾回收。通過JVM命令-XX:+UseParallGC可以使用並行垃圾回收器。並行回收器有三種:1.ParNew,作用於新生代; 2.Parallel Scavenge 作用於新生代,但以吞吐量為主;3.Parallel Old,作用於老年代,也已吞吐量為主,配合2使用。

(3).併發標記掃描垃圾回收器(CMS)

多執行緒,標記清理(Full GC的時候用)通過JVM命令 -XX:+UseConcMarkSweepGC使用, 主要用於老生代,策略為:

老代只有兩次短暫停,其他時間應用程式與收集執行緒併發的清除。採用兩次短暫停來替代標記整理演算法的長暫停,它的收集週期:  

初始標記(CMS-initial-mark) -> 併發標記(CMS-concurrent-mark) -> 重新標記(CMS-remark)-> 併發清除(CMS-concurrent-sweep) ->併發重設狀態等待下次CMS的觸發(CMS-concurrent-reset)。

它的主要適合場景是對響應時間的重要性需求大於對吞吐量的要求,能夠承受垃圾回收執行緒和應用執行緒共享處理器資源,並且應用中存在比較多的長生命週期的物件的應用。但CMS收集演算法在最為耗時的記憶體區域遍歷時採用多執行緒併發操作,對於伺服器CPU資源不夠的情況下,其實對效能是沒有提升的,反而會導致系統吞吐量的下降;

(4).G1垃圾回收器

適用於堆記憶體很大的情況,它將對記憶體分割成不同的區域,並且併發的對其進行回收,回收後對剩餘記憶體壓縮,標記整理,伺服器端適用。

相關推薦

(5) Java GC演算法種類

GC演算法主要有以下三種方法(都是以GC Roots可達性為依據,引用計數演算法實現簡單,但由於存在迴圈引用問題,故已不採用,詳見:Java GC(概述)) (1).複製收集演算法 針對Youn

Java虛擬機器詳解04----GC演算法種類【重要】

【宣告】  歡迎轉載,但請保留文章原始出處→_→  本文主要內容: GC的概念 GC演算法     引用計數法(無法解決迴圈引用的問題,不被java採納)       根搜尋演算法       現代虛擬機

Java虛擬機器詳解----GC演算法種類【重要】

轉載自:http://www.cnblogs.com/smyhvae/p/4744233.html 本文主要內容: GC的概念GC演算法    引用計數法(無法解決迴圈引用的問題,不被java採納)       根搜尋演算法       現代虛擬機器中的垃圾蒐集演算法:

jvm系列(三):java GC演算法 垃圾收集器

GC演算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被稱為“GC”,它誕生於1960年 MIT 的 Lisp 語言,經過半個多世紀,目前已經十分成熟了。 jvm 中,程式計數器、虛擬機器棧、本地方法棧都是隨執行緒而生隨執行緒而滅,棧幀隨著方法的進入和退出做入棧和出棧

Java GC 演算法總結

引言   Java的堆是一個執行時資料區,類的例項(物件)從中分配空間。Java虛擬機器(JVM)的堆中儲存著正在執行的應用程式所建立的所有物件,這些物件通過new、newarray、anewarray和multianewarray等指令建立,但是它們不需要程式程式碼來顯式地釋放。一般來說,堆的是由垃圾回收

JVM之GC演算法種類

垃圾收集演算法 這裡說說5種GC演算法,在說GC演算法前,先談談判斷物件是否活著的可達性分析演算法 可達性分析演算法 引用計數演算法 標記-清除演算法 標記-整理演算法 複製演算法 分代收集演算法 可達性分析演算法 垃圾回收,首先要判斷物件

阿里面試官都愛問的記憶體管理和GC演算法回收策略

JVM記憶體組成結構 JVM棧由堆、棧、本地方法棧、方法區等部分組成,結構圖如下所示: JVM記憶體回收 Sun的JVMGene

3.深入jvm核心-原理、診斷與優化-4. GC演算法種類

一、GC演算法和種類 GC的概念 GC演算法 引用計數法 標記清除 標記壓縮 複製演算法 可觸及性 Stop-The-World

JavaGC機制演算法

      GC的階段 對每個物件而言,垃圾回收分為兩個階段:finalization和reclamation。  finalization: 指執行這個物件的finalize的方法。 reclamation: 回收被這個物件使

java學習-排序加密簽名時資料排序方式 十大經典排序演算法(動圖演示) Java Comparator字元排序(數字、字母、中文混合排序) 編寫高質量程式碼:改善Java程式的151個建議(第5章:陣列和集合___建議70~74)

排序有兩種 1. 類實現comparable介面呼叫List.sort(null)或Collections.sort(List<T>)方法進行排序 jdk內建的基本型別包裝類等都實現了Comparablel介面,預設是使用自然排序,即升序排序 自定義類實現Comparable介面必須要實現c

JAVA復習5 Java循環結構 - for, while do...while

con dsm key width 限定 一個 bre ava mil 就我所知道的編程語言中都有循環語句: for, while 及 do...while,在這裏要說的就是他們的差別,我不喜歡用語言來說,大家看代碼:coding.............

java虛擬機器5.垃圾收集演算法

 1. 標記 - 清除演算法 首先標記出所有需要回收的物件,在標記完成後再統一回收。它的標記過程其實基於上面的可達性分析演算法。之所以說這是最基礎的收集演算法,是因為後續的收集演算法都是基於這種思路並對其不足進行改進而得到的。它的不足有兩個: 標記和清除過程效率不高; 標記清

垃圾回收機制(GCJava記憶體區域物件

前言   上一篇文章Java記憶體區域及物件講述了Java記憶體執行時的各個部分,其中程式計數器、虛擬機器棧、本地方法棧3個區域隨執行緒生而生,隨執行緒滅而滅,在這幾個區域是不需要過多的考慮回收的問題的,因為方法結束或者執行緒結束時,記憶體自然就跟隨著回收了;而Java堆和方法區則不一樣,一個介面中的多個實

【學習筆記】 唐大仕—Java程式設計 第5講 深入理解Java語言之5.2 多型虛方法呼叫

/** * 多型及虛方法呼叫 * @author cnRicky * @date 2018.11.7 */ 多型 多型(Polymorphism)是指一個程式中相同的名字表示不同的含義的情況 多型有兩種情形 編譯時多型:  *過載(Overload)(多個同名的不同方法)  *如 p.sayH

螞蟻金服 java三面:metaQ訊息中介軟體 + GC演算法 + MySQL資料同步

一面: JVM資料儲存模型,新生代、年老代的構造? java GC演算法,什麼時候會觸發minor gc,什麼時候會觸發full gc? GC 可達性分析中哪些算是GC ROOT? 你熟悉的JVM調優引數,使用過哪些調優工具? Java 有什麼鎖型別?

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

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

Java虛擬機器:GC演算法深度解析

   在前面的文章裡介紹了可達性分析演算法,它為我們解決了判定哪些物件可以回收的問題,接下來就該我們的垃圾收集演算法出場了。不同的垃圾收集演算法有各自不同的優缺點,在JVM實現中,往往不是採用單一的一種演算法進行回收,而是採用幾種不同的演算法組合使用,來達到最好的收集效果。接下來

java 實現傅立葉變換演算法 複數的運算

最近專案需求,需要把python中的演算法移植到java上,其中有一部分需要用到複數的運算和傅立葉變換演算法,廢話不多說 如下: package qrs; /** * 複數的運算 * */ public class Complex { private final double

5年常考Java面試題答案整理(一)

下列面試題都是在網上收集的,本人抱著學習的態度找了下參考答案,有不足的地方還請指正,更多精彩內容可以關注我的微信公眾號:Java團長 1、面向物件的特徵有哪些方面? 抽象:將同類物件的共同特徵提取出來構造類。 繼承:基於基類建立新類。 封裝:將資料隱藏起來,對

GC種類GC演算法種類精簡梳理

主要有五種GC: 1.Serial GC Serial體現在工作是單執行緒的,精簡,但是垃圾收集時會進入"stop-the-world"狀態。是JDK8中client模式下預設GC。新生代的Serial GC採用複製演算法,老年代的Serial GC採用標記-整理演算法,由於區別演算法不同,