您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關 JVM中的垃圾收集算法是怎么樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
1,標記-清除算法
概念:首先標記出所有需要回收的對象,在標記完成后統一回收所有標記的對象。 特點: 1)效率問題:標記和清除的效率都不高。 2)空間問題:標記清除之后會產生大量不連續的內存碎片,碎片太多可能會導致以后需要分配較大的對象時,因無法找到足夠大的連續內存而不得不提前觸發另一次垃圾收集的動作。
2,復制算法
概念:將可用的內存分為(容量)大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用完后,就將還存活的對象復制到另一塊上面,然后再把已使用過的內存塊一次性清理掉。 特點: 1)效率:實現簡單,運行效率高 2)空間問題:將內存的大小縮小為原來的一半 應用:新生代的回收 提醒: 1)新生代中大部分的對象時“朝生夕死”的,所有并不需要安裝1:1的比例來劃分內存空間。 2)虛擬機將新生代內存分為一塊較大的Eden空間和兩塊較小的Survivor空間(Survivor to和Survivor from),每次使用Eden空間和其中一塊Survivor空間。 過程: 1)每次創建對象時,首先會在Eden中分配,若Eden已滿,則在Survior from中分配,如果Eden和Survior from都無法容納這個對象,則JVM會進行一次GC; 2)GC時,將Eden和Survivor from中還存活的對象一次性地復制到另外一塊Survivor to空間上,最后清理掉Eden和Survivor form空間; 3)當Survivor to空間不夠用時,需要依賴老年代進行分配擔保。 例如:HotSpot虛擬機默認Eden和兩個Survivor的大小比例是8:1:1,也就是每次新生代中可用內存的空間為整個新生代容量的90%,只有10%的內存會被浪費掉。 內存分配擔保機制: 在新生代GC(Minor GC)前,虛擬機會先檢查老年代中可用的最大連續空間是否大于新生代所有對象的總空間 1)如果滿足條件,那么新生代GC就可以確保是安全的 2)如果不滿足條件,則虛擬機會查看HandlePromotionFailure設置是否允許擔保失敗。 如果允許擔保失敗,那么會繼續檢查老年代中可用的最大連續空間是否大于歷次晉升到老年代的對象的平均大小, 如果大于,將會進行一次新生代GC,盡管這次新生代GC是有風險的 如果小于,那么這時不會進行新生代GC,而是改為進行一次老年代GC(Full GC) 如果不允許擔保失敗,那么這時不會進行新生代GC,而是改為進行一次老年代GC(Full GC)
3,標記-整理算法
概念:概念:首先標記出所有需要回收的對象,在標記完成后讓所有存活的對象都向一端移動,然后直接清理掉沒有存活對象的另一端。
4,分代收集算法
Java堆分為新生代和老年代,在新生代中采用 復制算法 回收,在老年代中使用 標記-清理 或 標記-整理 算法來回收
看完上述內容,你們對 JVM中的垃圾收集算法是怎么樣的有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。