基于JVM 中常見垃圾收集算法介紹
JVM 中常見的垃圾收集算法有四種:
標記-清除算法(Mark-Sweep);
復(fù)制算法(Copying);
標記-整理(Mark-Compact);
分代收集;
下面我們來一一介紹:
一、標記-清除算法(Mark-Sweep)
這是最基礎(chǔ)的垃圾收集算法,算法分為“標記”和“清除”兩個階段:首先標記出所有需要回收的對象,在標記完成后統(tǒng)一回收掉所有被標記的對象。它的主要缺點有兩個:一個是效率問題,標記和清除效率都不高;另一個是空間問題,標記清除后會產(chǎn)生大量不連續(xù)的內(nèi)存碎片,空間碎片太多可能會導(dǎo)致分配大對象時沒有足夠的大的連續(xù)空間,而不得不提前觸發(fā)另一次垃圾收集動作。
標記-清除算法示意圖
二、復(fù)制算法(Copying)
為了解決效率問題,有了“復(fù)制”的算法,他將可用內(nèi)存分為大小相同兩塊。每次只用一塊,當一塊空間用完了,就將還存活的對象復(fù)制到另一塊上,然后將剛使用過的內(nèi)存空間一次清理掉。這樣使得每次都是對其中的一塊進行內(nèi)存回收,內(nèi)存分配時也就不用考慮內(nèi)存碎片等復(fù)雜情況。實現(xiàn)簡單,運行高效。只是這種算法的代價是將內(nèi)存縮小到原來的一半,代價太貴了點。實際上,新生代中的對象98%都是朝生夕死,所以不需要按1:1的比例來分內(nèi)存,而是將內(nèi)存分為一塊較大的Eden空間和兩塊較小的Survivor空間,每次使用Eden空間和其中一塊Survivior空間。當回收時,將Eden和Survivor中還存活的對象一次性的拷貝到另一塊Suivivior中,最后清理掉Eden和剛用過的Survivor空間。
復(fù)制算法示意圖
三、標記-整理(Mark-Compact)
復(fù)制收集算法在對象存活率高的時候就要執(zhí)行較多的復(fù)制操作,效率將會變低。更關(guān)鍵的是,如果不想浪費50%的空間,就需要有額外的空間進行分配擔保用于應(yīng)付半?yún)^(qū)內(nèi)存中所有對象都100%存活的極端情況,所以在老年代一般不能直接選用這種算法。
因此人們提出另外一種“標記-整理”(Mark-Compact)算法由于老年代中的對象生存周期都較長,有人提出“標記-整理”算法,標記過程和“標記-清理”一樣,但在清除已死對象的同時會對存活對象進行整理,這樣可以減少碎片空間。
標記-整理算法示意圖
四、分代收集
當前商業(yè)虛擬機的垃圾收集都是采用“分代收集”(Generational Collecting)算法,這種算法并沒有什么新的思想出現(xiàn),只是根據(jù)對象不同的存活周期將內(nèi)存劃分為幾塊。一般是把Java堆分作新生代和老年代,這樣就可以根據(jù)各個年代的特點采用最適當?shù)氖占惴?。在新生代中,每次垃圾收集時都發(fā)現(xiàn)有大批對象死去,只有少量存活,那就用復(fù)制算法,只要少量復(fù)制成本就可以完成收集。而老年代中因為對象的存活率較高、周期長,就用“標記-整理”或“標記-清除”算法來回收。
以上這篇基于JVM 中常見垃圾收集算法介紹就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Idea導(dǎo)入eureka源碼實現(xiàn)過程解析
這篇文章主要介紹了Idea導(dǎo)入eureka源碼實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08java.lang.FileNotFoundException 異常的正確解決方法(親測有效)
java.io.FileNotFoundException是一個在文件操作過程中常見的異常,它屬于IOException的一個子類,這篇文章主要介紹了java.lang.FileNotFoundException 異常的正確解決方法(親測有效),需要的朋友可以參考下2024-01-01java實現(xiàn)輕量型http代理服務(wù)器示例
這篇文章主要介紹了java實現(xiàn)輕量型http代理服務(wù)器示例,需要的朋友可以參考下2014-04-04Eclipse中創(chuàng)建Web項目最新方法(2023年)
在Java開發(fā)人員中,最常用的開發(fā)工具應(yīng)該就是Eclipse,下面這篇文章主要給大家介紹了關(guān)于Eclipse中創(chuàng)建Web項目2023年最新的方法,需要的朋友可以參考下2023-09-09elasticsearch+logstash并使用java代碼實現(xiàn)日志檢索
這篇文章主要介紹了elasticsearch+logstash并使用java代碼實現(xiàn)日志檢索,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02