JVM垃圾回收(演算法)
1、回收演算法
標記回收演算法(Mark and Sweep GC)
從GC Roots
集合開始,將記憶體整個遍歷一次,保留所有可以被GC Roots
直接或間接引用到的物件,而剩下的物件都當作垃圾對待並回收,這個演算法需要中斷程序內其它元件的執行並且可能產生記憶體碎片複製演算法 (Copying)
將現有的記憶體空間分為兩快,每次只使用其中一塊,在垃圾回收時將正在使用的記憶體中的存活物件複製到未被使用的記憶體塊中,之後,清除正在使用的記憶體塊中的所有物件,交換兩個記憶體的角色,完成垃圾回收。標記-壓縮演算法 (Mark-Compact)
先需要從根節點開始對所有可達物件做一次標記,但之後,它並不簡單地清理未標記的物件,而是將所有的存活物件壓縮到記憶體的一端。之後,清理邊界外所有的空間。這種方法既避免了碎片的產生,又不需要兩塊相同的記憶體空間,因此,其價效比比較高。分代
將所有的新建物件都放入稱為年輕代的記憶體區域,年輕代的特點是物件會很快回收,因此,在年輕代就選擇效率較高的複製演算法。當一個物件經過幾次回收後依然存活,物件就會被放入稱為老年代的記憶體空間。對於新生代適用於複製演算法,而對於老年代則採取標記-壓縮演算法。
2、複製演算法
和標記-壓縮演算法
的區別
乍一看這兩個演算法似乎並沒有多大的區別,都是標記了然後挪到另外的記憶體地址進行回收,那為什麼不同的分代要使用不同的回收演算法呢?
其實2者最大的區別在於前者是用空間換時間後者則是用時間換空間
。
前者的在工作的時候是不沒有獨立的mark
與copy
段的,而是合在一起做一個動作,就叫scavenge
evacuate
,或者就叫copy
)。也就是說,每發現一個這次收集中尚未訪問過的活物件就直接copy
到新地方,同時設定forwarding pointer
。這樣的工作方式就需要多一份空間。
後者在工作的時候則需要分別的mark
與compact
階段,mark
階段用來發現並標記所有活的物件,然後compact
階段才移動物件來達到compact
的目的。如果compact
方式是sliding compaction
,則在mark
之後就可以按順序一個個物件滑動
到空間的某一側。因為已經先遍歷了整個空間裡的物件圖,知道所有的活物件了,所以移動的時候就可以在同一個空間內而不需要多一份空間。
所以新生代的回收會更快一點,老年代的回收則會需要更長時間,同時壓縮階段是會暫停應用的,所以給我們應該儘量避免物件出現在老年代。
相關推薦
JVM垃圾回收(演算法)
1、回收演算法 標記回收演算法(Mark and Sweep GC) 從GC Roots集合開始,將記憶體整個遍歷一次,保留所有可以被GC Roots直接或間接引用到的物件,而剩下的物件都當作垃圾對待並回收,這個演算法需要中斷程序內其它元件的執行並
JVM——垃圾回收(GC)
.text 永久代 lines script from nes ng- code addclass GC簡單介紹 java語言執行在java虛擬機(jvm)上。為了解決有限的空間和性能的保證這個矛盾體,jvm所具備的GC能力。能夠有效的清除不用的對象。
JVM垃圾回收(四)- GC算法:實現(1)
並行 ctime 配置 使用情況 ava 第一個 中標 算法 bsp GC算法:實現 上面我們介紹了GC算法中的核心概念,接下來我們看一下JVM裏的具體實現。首先必須了解的一個重要的事實是:對於大部分的JVM來說,兩種不同的GC算法是必須的,一個是清理Young Gene
JVM 垃圾回收(GC)機制
目錄 一、背景 二、 哪些記憶體需要回收? 1、引用計數演算法 2 、可達性分析演算法 三、 四種引用狀態 1、強引用 2、軟引用 3、弱引用 4、虛引用 物件死亡(被回收)前的最後一次掙扎 方法區如何判斷是否需要回收 四、垃圾收集
12 JVM 垃圾回收(下)
-o 不用 通過 字節數 water 直接 重新 標記 被占用 Java 虛擬機的堆劃分 Java 虛擬機將堆劃分為新生代和老年代。其中新生代又被劃分為 Eden 區,以及兩個大小相同的 Survivor 區。 默認情況下,Java 虛擬機采取一種動態分配的策略,根據對象生
JVM垃圾回收(下)
接著上一篇,介紹完了 JVM 中識別需要回收的垃圾物件之後,這一篇我們來說說 JVM 是如何進行垃圾回收。 首先要在這裡介紹一下80/20 法則: 約僅有20%的變因操縱著80%的局面。也就是說:所有變數中,最重要的僅有20%,雖然剩餘的80%佔了多數,控制的範圍卻遠低於“關鍵的少數”。 Java 物件
JVM垃圾回收(上)
Java 中的垃圾回收,常常是由 JVM 幫我們做好的。雖然這節省了大家很多的學習的成本,提高了專案的執行效率,但是當專案變得越來越複雜,使用者量越來越大時,還是需要我們懂得垃圾回收機制,這樣也能進行更深一步的優化。 辨別物件存亡 垃圾回收( Garbage Collection,以下簡稱 GC ),從字面
JVM垃圾回收(GC)
### JVM垃圾回收(GC) #### 1. 判斷物件是否可以被回收 - 引用計數法:每個物件有一個引用計數屬性,新增一個引用時計數加1,引用釋放時計數減1,計數為0時可以回收。此方法簡單,但**無法解決物件相互迴圈引用的問題**。 ```java // 迴圈引用 Node a=new N
JVM (四)--垃圾回收(一)
程式計數器、虛擬機器棧、本地方法棧這三個區域屬於執行緒私有,只存在於執行緒的生命週期內,執行緒結束之後也會消失,因此,不需要對這三個區域進行垃圾回收。垃圾回收主要針對方法區和Java堆進行。 一、判斷一個物件是否存活 1、引用計數演算法 給物件新增一個引用計數器,當物件增加一個引用時
Java垃圾回收(GC)機制詳解
nbsp 引用計數 維護 png 對象 最新 新的 com 前沿 垃圾回收算法有兩種,根據不同的虛擬機策略不同 1、引用計數法 2、可達性分析法 由於我們平常使用的hotspot虛擬機用的是第二種。 那哪些是可達的呢? 這個算法的基本思想是通過一系列稱為“GC Roots”
各種垃圾回收 (轉)
垃圾回收算法 告訴 策略 trac 銷毀 pin 完整 多線程 概念 1. 垃圾回收的意義 在C++中,對象所占的內存在程序結束運行之前一直被占用,在明確釋放之前不能分配給其它對象;而在Java中,當沒有對象引用指向原先分配給某個對象的內存時,該內存便成為垃圾。JVM的一
JVM垃圾回收機制演算法分析
JVM記憶體執行時資料區 一、什麼是垃圾回收機制gc垃圾回收機制&&演算法 什麼是垃圾回收機制: 不定時去堆記憶體清理不可達物件。不可達的物件並不會馬上就會直接回收,而是至少要經過兩次標記的過程。 public class Test { public st
深入拆解虛擬機器(九)垃圾回收(下)
堆記憶體劃分 Java虛擬機器將堆分為新生代和老年代,並且對不同代採用不同的垃圾回收演算法。其中,新生代分為Eden區和兩個大小一致的Survivor區,並且其中一個Survivor區是空的 Minor GC (1)在只針對新生代的Minor GC中,Eden區和非S空
深入拆解虛擬機器(八)垃圾回收(上)
引用計數法 (1)它的做法是為每個物件新增一個引用計數器,用來統計指向該物件的引用個數。一旦某個物件 的引用計數器為0,則說明該物件已經死亡,便可以被回收了。 (2)具體實現:如果有一個引用,被賦值為某一個物件,那麼該物件的引用計數器+1。如果指向某一個物件的引用,被賦值為其他值
Java虛擬機器 :Java垃圾回收(GC)機制詳解
轉自:http://www.importnew.com/28413.html 哪些記憶體需要回收? 哪些記憶體需要回收是垃圾回收機制第一個要考慮的問題,所謂“要回收的垃圾”無非就是那些不可能再被任何途徑使用的物件。那麼如何找到這些物件? 1、引用計數法 這個演算法的實現是,給物件中新
Python3 垃圾回收(GC)(一)
1. 小整數物件池 整數在程式中的使用非常廣泛,Python為了優化速度,使用了小整數物件池, 避免為整數頻繁申請和銷燬記憶體空間。 Python 對小整數的定義是 [-5, 257) 這些整數物件是提前建立好的,不會被垃圾回收。在一個 Python 的程式中,所有位於這個範圍內的整數使用
JAVA虛擬機器之一:垃圾回收(GC)機制
引言 java對於其它語言(c/c++)來說,建立一個物件使用後,不用顯式的delete/free,且能在一定程度上保證系統記憶體資源及時回收,這要功歸於java的自動垃圾回收機制(Garbage Collection,GC),但也是因為自動回收機制存在,一旦系統內洩漏或存
淺談java垃圾回收(一)
本文簡述java垃圾回收機制自己的一點理解,希望能對java學習的朋友有一點幫助,謝謝; 先了解下JVM: JVM百度百科詳情https://baike.so.com/doc/1063579-1125177.html JVM是Java Virtual Machine(Java虛擬機器)的
對比Ruby和Python的垃圾回收(2):代式垃圾回收機制
上週,我根據之前在RuPy上做的一個名為“Visualizing Garbage Collection in Ruby and Python.”的報告寫了這篇文章的上半部分。在上篇中,我解釋了標準Ruby(也被稱為Matz的Ruby直譯器或是MRI)是如何使用名為
Java中垃圾回收(gc)問題
以下哪項陳述是正確的? A. 垃圾回收執行緒的優先順序很高,以保證不再 使用的記憶體將被及時回收 B. 垃圾收集允許程式開發者明確指定釋放 哪一個物件 C. 垃圾回收機制保證了JAVA程式不會出現 記憶體溢位 D. 進入”Dead”狀態的執行緒將被垃圾回