1. 程式人生 > >Java 虛擬機器 GC 的過程

Java 虛擬機器 GC 的過程

回收流程
1)大多數物件在建立後很短的時間內就會沒有任何物件再使用它了,即未被其它物件引用。
2)大多數一直被使用的物件(老物件)很少引用新建立的物件。
絕大部分物件的建立後是被放到eden區,為什麼說是絕大部分,因為會有一些物件建立後直接被old區區。
因為在eden區全部都是新生物件,所以大部分物件會很快失去引用 。被回收後會獲得大量的空間。
當經歷了一次回收後紅色的被回收掉,藍色的進入From區或者Survivor區。所以時候在該區域的物件至少經歷過一次回收。
當第二次回收的時候,發現form區域一個物件失去引用,那麼GC就將其回收。紅色將被回收,藍色存活。接著藍色物件將會被複制到Survivor區域,然後清空from區域。
所以說在每一次回收以後Eden區是空的,from或Survivor區域有一個是空的。
在From和Survivor兩個空間,每一次GC都是將一個區域存活的複製到另一個區域,然後將該區域的物件全部清除。來回往復。如果達到倖存次數的閾值,那麼該物件將被移動到old區。
old區的物件就相對來說穩定了,不會出現eden區域的大面積死亡的情況。
因為在eden區和old區相比,old區域所佔的記憶體空間肯定是最大的,一般都會比eden區域要大,因為得考慮到最壞的情況,在專案啟動的時候所有的eden物件都被移動到了old區域。

下面介紹一下幾種常用的回收演算法:
1標記清除演算法。
這裡寫圖片描述
我們將失去引用的物件標記為,在圖中為紅色區域,標記之後將其GC,回收完的記憶體如右圖。但是這樣的弊端會導致記憶體中有碎片產生,導致可用的連續空間越來越少。
複製演算法
上用於Eden區的From和Survivor區,將一個區域劃分成兩個區域,將沒有失去引用的物件複製到另一個區域,然後清空該區域。獲得更多的連續空間。

標記 - 整理演算法

這裡寫圖片描述

其實和標記清除演算法基本一致,只不過在清理完成之後,將所有存活的物件都移動到一端,這樣做的缺點就是會有複製的開銷,但是每次清理後留下的都是連續的記憶體空間。

相關推薦

弄清Java虛擬機器GC的執行過程

前言:要弄清Java虛擬機器GC的整個過程,就得弄明白Java虛擬機器用什麼來進行GC?Java虛擬機器在哪裡GC?什麼時候GC?GC什麼? 開門見山 GC(Garbage Collection)垃圾收集,JVM一個非常重要的功能。本文將圍繞著JVM的GC這個動作展開,來過一遍GC的整個運作過程。 JV

Java 虛擬機器 GC過程

1)大多數物件在建立後很短的時間內就會沒有任何物件再使用它了,即未被其它物件引用。 2)大多數一直被使用的物件(老物件)很少引用新建立的物件。 絕大部分物件的建立後是被放到eden區,為什麼說是絕大部分,因為會有一些物件建立後直接被old區區。

JAVA 虛擬機器 GC演算法和GC回收器

本章內容 標記-清除演算法 複製演算法  標記-整理演算法 分代收集演算法 七種垃圾收集器   標記-清除演算法 標記;遍歷所有的GC Roots,然後將所有GC Roots可達的物件標記為存活的物件 清除:清除的過程將遍歷堆中所有的物件,將沒有標記的物件全部清除

Java 虛擬機器 gc演算法總結

一、垃圾收集基本的演算法 1. 引用計數(Reference Counting) 為每一個物件新增一個計數器,計數器記錄了對該物件的活躍引用的數量。如果計數器為0,則說明這個物件沒有被任何變數所引用,即應該進行垃圾收集。 收集過程如下: 1)減少被收集物件所引用的物件的計數

探祕Java虛擬機器 gc的監控

1、Java虛擬機器執行時的資料區 2、常用的記憶體區域調節引數 -Xms:初始堆大小,預設為實體記憶體的1/64(<1GB);預設(MinHeapFreeRatio引數可以調整)空餘堆記憶體小於40%時,JVM就會增大堆直到-Xmx的最大限制 -Xmx

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

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

深入理解Java虛擬機器(四)Eden、Survivor、老年代、GC日誌

1. 年輕代 1.1 Eden區和Survivor區 新生代GC(Minor GC):指發生在新生代的垃圾收集動作,Minor GC非常頻繁,新生代採用複製演算法,一般回收速度也比較快。因為採用複製演算法,所以年輕代分為三部分:1個Eden區和2個Survivor區(分別叫Fro

java虛擬機器類載入過程(精簡版)

java虛擬機器類載入過程步驟:     1.載入 將虛擬機器外部的二進位制位元組流儲存到方法區中: a.獲取此類二進位制流: 通過一個類的全限定名來獲取定義此類的二進位制流; b.資料結構轉化: 將位元組流所代表的靜態儲存結

Java虛擬機器Java垃圾回收(GC)機制詳解

轉自:http://www.importnew.com/28413.html 哪些記憶體需要回收? 哪些記憶體需要回收是垃圾回收機制第一個要考慮的問題,所謂“要回收的垃圾”無非就是那些不可能再被任何途徑使用的物件。那麼如何找到這些物件? 1、引用計數法 這個演算法的實現是,給物件中新

Java虛擬機器7:記憶體溢位和記憶體洩露、並行和併發、Minor GC和Full GC、Client模式和Server模式的區別

記憶體溢位和記憶體洩露的區別 1、記憶體溢位 記憶體溢位指的是程式在申請記憶體的時候,沒有足夠大的空間可以分配了。 2、記憶體洩露 記憶體洩露指的是程式在申請記憶體之後,沒有辦法釋放掉已經申請到記憶體,它始終佔用著記憶體,即被分配的物件可達但無用。記憶體洩露一般都是因

JVM GC調優(2)-----GC演算法判定物件可以被回收(部分摘自深入理解Java虛擬機器

這次我們介紹JVM中的GC演算法 引用計數法 可達性分析法 首先我們提出四個問題 哪裡的記憶體需要回收? 什麼時候回收? 如何回收? Java與C++之間有一堵由記憶體動態分配和垃圾收集技術所圍成的“高牆”, 牆外面的人想進去, 牆裡面的人卻想出來。

JVM GC調優(3)-----GC演算法(部分摘自深入理解Java虛擬機器

介紹幾種GC演算法的思想及其發展過程: 標記-清除 複製 標記-壓縮 分代收集演算法 GC演算法主要是用於堆死亡物件的清理的集中方式,他們各有優缺點,下面我們開始做介紹 標記清除演算法 原理解析 -最基礎的收集演算法是“標記-清除”( Mark-Swe

聊聊 Java 虛擬機器:類的載入過程

我們都知道 Java 原始檔通過編譯器 javac 命令能夠編譯生成相應的 class 檔案,即二進位制位元組碼檔案。Java 虛擬機器將描述類或介面的 class 檔案(準確地說,應該是類的二進位制位元組流)載入到記憶體,對資料進行校驗、轉換解析和初始化,最終形成能夠被虛擬機器直接使用的 Java 型別

java虛擬機器GC學習筆記

近期學習java的垃圾回收機制(GC),遂翻閱了《深入理解java虛擬機器》這本書籍,本文相對書中內容進行記錄,也算是學習筆記了,由於水平有限,對於本文出現的問題和錯誤,還望大家即時指出和交流! 一、執行時資料區分類如下圖:(圖片出自《深入理解java虛擬機器》) 1

深入理解java虛擬機器---java記憶體區域與記憶體溢位異常---3垃圾回收機制GC

  一、垃圾回收---物件存活演算法:     1、引用計數器法:在物件身上放上一個計數器,當有引用則加一,引用失效則減一,為零則可回收。(無法解決物件相互引用)     2、可達性分析法(java),GC roots為起始點,從節點向下搜尋,搜尋路徑為引用鏈,不在引用鏈的物件則是可回收的物件

JAVA虛擬機器類載入過程

什麼時候進行類載入 jvm虛擬機器規範沒有強制性的規定何時需要進行類的載入,但是如果遇到了以下幾種情況的指令則強制必須立即對類進行載入 new 建立物件的時候, getstatic 讀取靜態欄位的時候, putstatic 設定靜態欄位的時候, invokes

Java虛擬機器GC垃圾回收機制

一,Java記憶體區域 1,用一張圖來表示記憶體區域 2,執行緒隔離的資料區(執行緒私有記憶體區域,執行緒之間互不影響) ①,程式計數器:是一塊較小的記憶體空間,可以看成是當前執行緒所執行的位元組碼的行號指示器。如果執行緒正在執行的是一個Java方法,這個計數器記錄的是

阿里P7帶你深入理解Java虛擬機器總結——類初始化過程

類的初始化過程 非法向前引用 編譯器手機的順序是由語句在原始檔中出現的順序決定的,靜態語句塊中只能訪問到定義在靜態語句之前的變數,定義它之後的變數,可以賦值,但不能訪問 public class Test{ static{ i=0; system.out.print(

java虛擬機器面試乾貨【拾】_G1 GC的回收機制

簡單來說,G1 GC的收集分為4個階段:年輕代GC,併發標記週期,混合回收和full GC。年輕代GCG1 GC的年輕代回收基本沿襲了之前的設計,通過複製演算法和一個Eden區、兩個Survivor區實現。但區別在於,大物件的分配是可以直接到大物件區間的(詳見上文)。此外,在

java虛擬機器面試乾貨【玖】_G1 GC的空間劃分

之前有看過介紹G1回收器的知識,但是一直沒有去完成一個整理。接著今天的功夫,好好把這部分知識總結一下。什麼是G1 GC通過前面的文章我們知道,在JDK 1.6版本之前,我們一般是使用ParNew+CMS兩個垃圾回收器來完成JVM中的垃圾回收的。但是它們的實現並不算特別的高效,