1. 程式人生 > >第四章 JVM垃圾回收演算法

第四章 JVM垃圾回收演算法

注意:本文主要參考自《分散式Java應用:基礎與實踐》,與《深入理解Java虛擬機器(第二版)》中的一些說法有一些不同,但是原理一致

1、三種垃圾回收演算法

  • 標記-清除(年老代)
  • 標記-整理(即標記-壓縮)(年老代)
  • 複製(年輕代)

1.1、標記-清除演算法

原理

  • 從根集合節點進行掃描,標記出所有的存活物件,最後掃描整個記憶體空間並清除沒有標記的物件(即死亡物件)

適用場合

  • 存活物件較多的情況下比較高效
  • 適用於年老代(即舊生代)

缺點

  • 容易產生記憶體碎片,再來一個比較大的物件時(典型情況:該物件的大小大於空閒表中的每一塊兒大小但是小於其中兩塊兒的和),會提前觸發垃圾回收
  • 掃描了整個空間兩次(第一次:標記存活物件;第二次:清除沒有標記的物件)

注意:

  • 在該情況下,記憶體不規整,物件的記憶體分配採用"空閒列表法",見《第二章

1.2、標記整理演算法

原理:

  • 從根集合節點進行掃描,標記出所有的存活物件,最後掃描整個記憶體空間並清除沒有標記的物件(即死亡物件)(可以發現前邊這些就是標記-清除演算法的原理),清除完之後,將所有的存活物件左移到一起。

適用場合:

  • 用於年老代(即舊生代)

缺點:

  • 需要移動物件,若物件非常多而且標記回收後的記憶體非常不完整,可能移動這個動作也會耗費一定時間
  • 掃描了整個空間兩次(第一次:標記存活物件;第二次:清除沒有標記的物件)

優點:

  • 不會產生記憶體碎片

注意:

1.3、複製演算法

原理:

  • 從根集合節點進行掃描,標記出所有的存活物件,並將這些存活的物件複製到一塊兒新的記憶體(圖中下邊的那一塊兒記憶體)上去,之後將原來的那一塊兒記憶體(圖中上邊的那一塊兒記憶體)全部回收掉

適用場合:

  • 存活物件較少的情況下比較高效
  • 掃描了整個空間一次(標記存活物件並複製移動)
  • 適用於年輕代(即新生代):基本上98%的物件是"朝生夕死"的,存活下來的會很少

缺點:

  • 需要一塊兒空的記憶體空間
  • 需要複製移動物件

注意:

  • 在該情況下,記憶體規整,物件的記憶體分配採用"指標碰撞法",見《第二章 JVM記憶體分配
  • 以空間換時間:通過一塊兒空記憶體的使用,減少了一次掃描

2、垃圾回收機制

根據《第一章 JVM記憶體結構》所說,年輕代分為Eden區和survivor區(兩塊兒:from和to),且Eden:from:to==8:1:1

1)新產生的物件優先分配在Eden區(除非配置了-XX:PretenureSizeThreshold,大於該值的物件會直接進入年老代);

2)當Eden區滿了或放不下了,這時候其中存活的物件會複製到from區(這裡,需要注意的是,如果存活下來的物件from區都放不下,則這些存活下來的物件全部進入年老代),之後Eden區的記憶體全部回收掉;注意:如果是Eden區沒有滿,但是來了一個小物件Eden區放不下,這時候Eden區存活物件複製到from區後,清空Eden區,之後剛才的小物件再進入Eden區

3)之後產生的物件繼續分配在Eden區,當Eden區又滿了或放不下了,這時候將會把Eden區和from區存活下來的物件複製到to區(同理,如果存活下來的物件to區都放不下,則這些存活下來的物件全部進入年老代),之後回收掉Eden區和from區的所有記憶體;

4)如上這樣,會有很多物件會被複制很多次(每複製一次,物件的年齡就+1),預設情況下,當物件被複制了15次(這個次數可以通過:-XX:MaxTenuringThreshold來配置),就會進入年老代了

5)當年老代滿了或者存放不下將要進入年老代的存活物件的時候,就會發生一次Full GC(這個是我們最需要減少的,因為耗時很嚴重)

總結:

  • 年輕代:複製演算法
  • 年老代:標記-清除或標記-整理(前者相較於後者會快一些但是會產生記憶體碎片,後者相較於前者不會產生記憶體碎片但是由於要移動存活物件所以會慢一些)
  • 以上這種年輕代與年老代分別採用不同回收演算法的方式稱為"分代收集演算法",這也是當下企業使用的一種方式
  • 每一種演算法都會有很多不同的垃圾回收器去實現,在實際使用中,根據自己的業務特點做出選擇就好

補充:卡表(《實戰java虛擬機器》)

相關推薦

JVM垃圾回收演算法

注意:本文主要參考自《分散式Java應用:基礎與實踐》,與《深入理解Java虛擬機器(第二版)》中的一些說法有一些不同,但是原理一致 1、三種垃圾回收演算法 標記-清除(年老代) 標記-整理(即標記-壓縮)(年老代) 複製(年輕代) 1.1、標記-清除演算法 原理: 從根

JVM記憶體回收區域+物件存活的判斷+引用型別+垃圾回收執行緒

注意:本文主要參考自《深入理解Java虛擬機器(第二版)》 說明:檢視本文之前,推薦先知道JVM記憶體結構,見《第一章 JVM記憶體結構》 1、記憶體回收的區域 堆:這是GC的主要區域 方法區:回收兩樣東西 無用的類 廢棄的常量 棧和PC暫存器是執行緒私有區域,不發生GC

JVM垃圾判定演算法+種引用+JVM垃圾回收演算法

JVM垃圾判定演算法 常見的JVM垃圾判定演算法包括:引用計數演算法、可達性分析演算法。 引用計數演算法(Reference Counting) 1引用計數演算法是通過判斷物件的引用數量來決定物件是否可以被回收。 2給物件中新增一個引用計數器,每當有一個地方引用它

菜鳥學習JVM——垃圾回收演算法

Java垃圾回收演算法 所有的垃圾回收演算法都是為了解決三個問題: 哪些記憶體需要回收 什麼時候回收 怎麼回收 引用計數法(Reference Counting) 引用計數法原理很簡單,給每個物件分配一個計數器,當被引用時就加一,引用失效就減一。

JVM垃圾回收演算法與引數配置

★引用計數法  這是個古老而經典的垃圾收集演算法,其核心就是在物件被其他所引用時計數器+1,而當引用失效時-1,但是這種方式有非常嚴重的問題:無法處理迴圈引用的情況,還有就是每次進行加減操作比較浪費系統性能。 ★標記清除法  分為標記和清除兩個階段進行處理記憶體中的物件,當然

讀書筆記 ---- 《深入理解Java虛擬機器》---- 2篇:垃圾回收演算法

上一篇:Java記憶體區域與記憶體溢位異常:https://blog.csdn.net/pcwl1206/article/details/83990008 第2篇:垃圾回收演算法 一、判斷物件是否存活的演算法 1、引用計數法 2、可達性分析演算法 3、再談引用 4 

JVM垃圾回收演算法及收集器

  垃圾回收演算法 標記清除 標記-清除演算法將垃圾回收分為兩個階段:標記階段和清除階段。在標記階段首先通過根節點,標記所有從根節點開始的物件,未被標記的物件就是未被引用的垃圾物件。然後,在清除階段,清除所有未被標記的物件。標記清除演算法帶來的一個問題是會存在大量的空間碎片,因

jvm垃圾回收演算法以及回收器詳解

本文主要講述JVM中幾種常見的垃圾回收演算法和相關的垃圾回收器,以及常見的和GC相關的效能調優引數。 GC Roots 我們先來了解一下在Java中是如何判斷一個物件的生死的,有些語言比如Python是採用引用計數來統計的,但是這種做法可能會遇見迴圈引用的問題,在Ja

JVM垃圾回收演算法和幾種JVM垃圾收集器

一、JVM垃圾回收演算法 注意:只是簡單總結,不詳細解釋演算法概念,不理解自行百度。 1、複製演算法 2、標記-清理演算法 3、標記-整理演算法 4、兩個概念: 新生代:初始物件,一般是採用複製演算法,需要重點掌握理解,記憶體被分為一個Eden,兩個Survivor區。

jvm垃圾回收演算法

2018年11月01日 19:03:23 碼上碼下 閱讀數:4 標籤: jvm 垃圾回收

jvm垃圾回收演算法詳解

在JDK1.8+的版本中,JVM記憶體管理結構有了一定的優化調整。主要是方法區(持久代)取消變成了直接使用元資料區(直接記憶體)的方式,但是整體上JVM的結構並沒有大改,特別是我們最為關心的堆記憶體管理方式並沒有在JDK1.8+的版本中有什麼變化,所以圖中的結構

JVM 垃圾回收演算法回收器詳解

本文主要講述JVM中幾種常見的垃圾回收演算法和相關的垃圾回收器,以及常見的和GC相關的效能調優引數。 GC Roots 我們先來了解一下在Java中是如何判斷一個物件的生死的,有些語言比如Python是採用引用計數來統計的,但是這種做法可能會遇見迴圈引用的問題,在Java以及C#

JVM垃圾回收演算法解析

JVM垃圾回收演算法解析 標記-清除演算法 該演算法為最基礎的演算法。它分為標記和清除兩個階段,首先標記出需要回收的物件,在標記結束後,統一回收。該演算法存在兩個問題:一是效率問題,標記和清除過程效率都不太高,二是空間問題,在執行一次清除操作後,會存在好多不連續的記憶體碎片,從而造成資源的浪費。空間碎片

圖解JVM垃圾回收演算法

1 簡單介紹下----->垃圾回收概念 GC中的垃圾,指的是存在於記憶體中的、不會再被使用的物件。而垃圾回收就是把那些不再被使用的物件進行清除,收回佔用的記憶體空間。如果不及時對記憶體中的垃圾

JVM垃圾收集器(1)

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

JVM垃圾收集器(2)

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

JVM垃圾回收演算法垃圾收集器種類、常用垃圾收集器引數

現在的商業虛擬機器都採用這種方法進行回收新生代,但並不是將新生代分為兩個一樣大小的記憶體,由於考慮到98%的物件都是很快死亡的,所以將新生代分為 一個大的eden區和兩個小的survivor區,每次只使用eden區和其中一個survivor區,回收時將這兩個區中的存活物件複製到另外一個s區。預設情況eden區

JVM垃圾回收演算法的優缺點

最近在學習JVM的一些知識,所以特意寫下學習筆記來簡單記錄知識點,由於只是初步的學習,下面本人所總結的內容都比較簡單且不一定正確,如果有什麼錯誤希望大家能指出來,我看到後會進行修正。 垃圾分析演算法 功能:分析JVM堆上哪些物件是“垃圾” 引用計數法

深入JVM 原理(JVM垃圾回收流程

目錄 我們所有的資料都會儲存在JVM的堆記憶體之中,但是實際的開發中會經常建立很多臨時物件和常駐物件。所以,為了保證GC的效能問題,對於GC的處理流程如下圖所示: 對於整個GC流程裡,最需要處理的就是年輕代和老年代的記憶體清理操作,而元空間(永久代)都不在GC範圍

垃圾回收器:垃圾回收器的兩種算法

是否 div 搜索路徑 word position 其他 範圍 ava 對象實例 垃圾回收需要考慮三個問題: 哪些內存需要回收? 什麽時候回收? 如何回收? JVM中程序計數器、虛擬機棧、本地方法三個區域隨線程而生,隨線程而死,這三個區域的內存分配和回收都具有