1. 程式人生 > >常見的垃圾回收演算法以及它們的優缺點

常見的垃圾回收演算法以及它們的優缺點

顧名思義,垃圾回收就是釋放垃圾佔用的空間。

垃圾回收演算法:

1.Mark-Sweep(標記-清除)演算法  

        這是最基礎的垃圾回收演算法,之所以說它是最基礎的是因為它最容易實現,思想也是最簡單的。

標記-清除演算法分為兩個階段:

  標記階段和清除階段:

    a. 標記階段的任務是標記出所有需要被回收的物件

    b. 清除階段就是回收被標記的物件所佔用的空間。

            優點:標記-清除演算法實現起來比較容易

            缺點:但是有一個比較嚴重的問題就是容易產生記憶體碎片,碎片太多可能會導致後續過程中需要為大物件分配空間時無法找到足夠的空間而提前觸發新的一次垃圾收集動作。

    2.  2.Copying(複製)演算法  

為了解決Mark-Sweep演算法的缺陷,Copying演算法就被提了出來。它將可用記憶體按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這一塊的記憶體用完了,就將還存活著的物件複製到另外一塊上面,然後再把已使用的記憶體空間一次清理掉,這樣一來就不容易出現記憶體碎片的問題。

        優點:這種演算法雖然實現簡單,執行高效且不容易產生記憶體碎片。

        缺點:但是卻對記憶體空間的使用做出了高昂的代價,因為能夠使用的記憶體縮減到原來的一半。

3. .Mark-Compact(標記-整理)演算法

為了解決Copying演算法的缺陷,充分利用記憶體空間,提出了Mark-Compact演算法。該演算法標記階段和Mark-Sweep一樣,但是在完成標記之後,它不是直接清理可回收物件,而是將存活物件都向一端移動,然後清理掉端邊界以外的記憶體。

4.Generational Collection(分代收集)演算法

分代收集演算法是目前大部分JVM的垃圾收集器採用的演算法。

它的核心思想是根據物件存活的生命週期將記憶體劃分為若干個不同的區域。

一般情況下將堆區劃分為老年代(Tenured Generation)和新生代(Young Generation)

老年代的特點是每次垃圾收集時只有少量物件需要被回收

新生代的特點是每次垃圾回收時都有大量的物件需要被回收,那麼就可以根據不同代的特點採取最適合的收集演算法。

注意,在堆區之外還有一個代就是永久代(Permanet Generation),它用來儲存class類、常量、方法描述等。對永久代的回收主要回收兩部分內容:廢棄常量和無用的類。

相關推薦

常見垃圾回收演算法以及它們優缺點

顧名思義,垃圾回收就是釋放垃圾佔用的空間。垃圾回收演算法:1.Mark-Sweep(標記-清除)演算法          這是最基礎的垃圾回收演算法,之所以說它是最基礎的是因為它最容易實現,思想也是最簡單的。標記-清除演算法分為兩個階段:  標記階段和清除階段:    a.

JVM - 常見垃圾收集演算法以及原理

標記 - 清除演算法:該演算法分為標記和清除兩個階段,首先標記出所有需要回收的物件,在標記完成後統一回收所有被標記的物件。 缺點:1. 效率問題,標記和清除的效率都很低;2. 空間問題,標記清除之後會產生大量不連續的記憶體碎片,空間碎片太多可能導致以後在程式執行過程中需要分配較大物件時,無法找到

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

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

JVM常見垃圾回收演算法

jdk1.7.0_79   眾所周知,Java是一門不用程式設計師手動管理記憶體的語言,全靠JVM自動管理記憶體,既然是自動管理,那必然有一個垃圾記憶體的回收機制或者回收演算法。本文將介紹幾種常見的垃圾回收(下文簡稱GC)演算法。   在Java堆上分配一個記憶體給例項物

垃圾回收演算法——複製演算法 以及eden和survivor

複製(Copying)演算法說到底也是為了解決標記-清除演算法產生的那些碎片。首先將記憶體分為大小相等的兩部分(假設A、B兩部分),每次呢只使用其中的一部分(這裡我們假設為A區),等這部分用完了,這時候就將這裡面還能活下來的物件複製到另一部分記憶體(這裡設為B區)中,然後把A

JVM垃圾回收演算法優缺點

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

常見垃圾回收方法

多線程 產生 避免 能開 兩個 過渡 移除 代理 內存管理 1、標記清除法(Mark And Sweep) 第一步:從根部出發,遍歷全局,然後對所有可達的對象進行標記 第二步:對所有未標記的對象進行清除 優點:方法簡單,速度較快。缺點:容易產生較多的內存碎片。 采用這種方式

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

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

JVM知識(五):垃圾回收演算法

        在介紹垃圾回收演算法之前,我們需要先了解一個詞“stop the world”,stop the world會在執行某一個垃圾回收演算法的時候產生,JVM為了執行垃圾回收,會暫時java應用程式的執行,等垃圾回收完成後,再繼續執行。如果你使用JMeter測試

JAVA垃圾回收器與垃圾回收演算法

垃圾回收演算法 1 標記演算法 11 引用計數演算法 12 可達性分析演算法 2 回收演算法 21 標記-清除

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

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

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

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

網際網路技術學習27———垃圾回收演算法+垃圾收集器

垃圾回收Garbage Collection,簡稱GC。GC中的垃圾指的是記憶體中不會再被使用的物件,而回收就是相當於把垃圾“倒掉”。垃圾回收有很多演算法:引用計數法、標記壓縮法、複製演算法、分代、分割槽。 在java堆中,新生代/老年代 =1/2 或1/3比較合適 垃圾回收演算法 

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

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

jvm 三種垃圾回收演算法:標記-清除、複製演算法、標記-整理

標記-清除:先標記出GC Roots能關聯到的物件,然後清除這些被標記的物件,剩下的就是存活的物件了。 缺點: 1、清除需要被清理的物件後剩下的記憶體都是破碎的,如果要建立大物件,可能會因為找不到足夠的記憶體而再次觸發垃圾收集。 2、標記和清除的效率相對於其他演算法來說都不高,標記的原理

目錄 1.1. JVM記憶體模型總體架構圖 1 1.2. JAVA堆 2 1.3. 方法區 元空間(Metaspace) 2 1.4. 虛擬機器棧 3 1.5. 本地方法區 4 2. 垃圾回收演算法 4 2

目錄 1.1. JVM記憶體模型總體架構圖 1 1.2. JAVA堆 2 1.3. 方法區 元空間(Metaspace) 2 1.4. 虛擬機器棧 3 1.5. 本地方法區 4 2. 垃圾回收演算法 4 2.1. 標記-清除演算法(Mark-Sweep) 4

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

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

Java記憶體管理之用什麼方式回收垃圾、管理記憶體呢?垃圾回收演算法有哪些?

文章目錄 1. 什麼是垃圾? 2. 標記-清理(Marked-Sweep) 3. 標記-整理(Marked-Compact) 4. 複製(Copying) 6. Java分代回收機制 6.1 新生代-複製 回收機制

閱讀筆記-深入理解jvm虛擬機器-2-垃圾回收演算法

垃圾回收演算法: 標記-清除演算法: 首先將標記出所有需要回收的物件,然後進行統一回收所有物件 基礎的回收演算法。後續的演算法基於這種思路對其不足進行改進 缺點: 效率問題,標記和清除的效率都不高。 標記清除演算法會產生大量不連續的記憶體碎片。空間碎片太多會導致當

深入理解JVM——配置引數(三);垃圾回收演算法(四)

深入理解JVM(三)——配置引數 1、跟蹤引數 2、堆分配引數 3、棧分配引數 這三類引數分別用於跟蹤監控JVM狀態,分配堆記憶體、棧記憶體。 跟蹤引數 跟蹤監控JVM,用於JVM調優以及故障排查。 1、當發生GC時,列印GC簡要資訊 使