国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

基于JVM 中常見垃圾收集算法介紹

2024-07-13 10:17:07
字體:
來源:轉載
供稿:網友

JVM 中常見的垃圾收集算法有四種:

標記-清除算法(Mark-Sweep);

復制算法(Copying);

標記-整理(Mark-Compact);

分代收集;

下面我們來一一介紹:

一、標記-清除算法(Mark-Sweep)

這是最基礎的垃圾收集算法,算法分為“標記”和“清除”兩個階段:首先標記出所有需要回收的對象,在標記完成后統一回收掉所有被標記的對象。它的主要缺點有兩個:一個是效率問題,標記和清除效率都不高;另一個是空間問題,標記清除后會產生大量不連續的內存碎片,空間碎片太多可能會導致分配大對象時沒有足夠的大的連續空間,而不得不提前觸發另一次垃圾收集動作。

JVM,垃圾收集算法

標記-清除算法示意圖

二、復制算法(Copying)

為了解決效率問題,有了“復制”的算法,他將可用內存分為大小相同兩塊。每次只用一塊,當一塊空間用完了,就將還存活的對象復制到另一塊上,然后將剛使用過的內存空間一次清理掉。這樣使得每次都是對其中的一塊進行內存回收,內存分配時也就不用考慮內存碎片等復雜情況。實現簡單,運行高效。只是這種算法的代價是將內存縮小到原來的一半,代價太貴了點。實際上,新生代中的對象98%都是朝生夕死,所以不需要按1:1的比例來分內存,而是將內存分為一塊較大的Eden空間和兩塊較小的Survivor空間,每次使用Eden空間和其中一塊Survivior空間。當回收時,將Eden和Survivor中還存活的對象一次性的拷貝到另一塊Suivivior中,最后清理掉Eden和剛用過的Survivor空間。

JVM,垃圾收集算法

復制算法示意圖

三、標記-整理(Mark-Compact)

復制收集算法在對象存活率高的時候就要執行較多的復制操作,效率將會變低。更關鍵的是,如果不想浪費50%的空間,就需要有額外的空間進行分配擔保用于應付半區內存中所有對象都100%存活的極端情況,所以在老年代一般不能直接選用這種算法。

因此人們提出另外一種“標記-整理”(Mark-Compact)算法由于老年代中的對象生存周期都較長,有人提出“標記-整理”算法,標記過程和“標記-清理”一樣,但在清除已死對象的同時會對存活對象進行整理,這樣可以減少碎片空間。

JVM,垃圾收集算法

標記-整理算法示意圖

四、分代收集

當前商業虛擬機的垃圾收集都是采用“分代收集”(Generational Collecting)算法,這種算法并沒有什么新的思想出現,只是根據對象不同的存活周期將內存劃分為幾塊。一般是把Java堆分作新生代和老年代,這樣就可以根據各個年代的特點采用最適當的收集算法。在新生代中,每次垃圾收集時都發現有大批對象死去,只有少量存活,那就用復制算法,只要少量復制成本就可以完成收集。而老年代中因為對象的存活率較高、周期長,就用“標記-整理”或“標記-清除”算法來回收。

以上這篇基于JVM 中常見垃圾收集算法介紹就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丰镇市| 肥乡县| 常山县| 万年县| 田东县| 邵武市| 关岭| 柞水县| 咸丰县| 神木县| 如皋市| 上高县| 定陶县| 邻水| 烟台市| 明光市| 涟源市| 江陵县| 调兵山市| 成安县| 大渡口区| 甘泉县| 常州市| 邹城市| 务川| 玛纳斯县| 梁河县| 丰台区| 九江市| 佳木斯市| 龙泉市| 柳林县| 阿巴嘎旗| 赤城县| 尼木县| 彭州市| 普定县| 锡林浩特市| 通化市| 东至县| 灵寿县|