JVM基礎到實戰04-垃圾回收算法

上一章講了對象的存活分析,分析完對象是否存活後,我們就需要執行相應的垃圾回收過程,至於選擇哪種垃圾回收算法呢,目前主要有以下三種垃圾回收算法:

1.標記清除算法

過程:標記--》清除

產生的問題:
1.標記和清除的過程效率都不高
2.空間問題,標記清除後會產生大量的不連續內存碎片,空間碎片越多會導致以後程序在
在分配較大的對象實,無法找到足夠的連續內存二不得不提前出發一次垃圾收集動作。

2. 複製算法

過程:分爲AB兩塊內存,將A中存活對象內存複製到B中,然後將A中的全部置爲空

爲什麼出現?
現在的商業虛擬機都採用這種算法來回收新生代,主要是新生代中98%的對象都是朝生夕死的,
所以有大量的內存是需要回收的,我們只需要移動少部分內存。所以並不需要按1:1來分配
而是將內存分爲較大的一塊Eden和兩塊較小的Survivor空間,每次實用一塊Eden和其中一塊survivor,
survivor from 和survivor to。比例是8:1:1,
如果騰出的內存不夠,會用擔保分配算法(將對象分配至老年代)

缺點:複製算法在對象存活率較高時,需要複製較多的內存,更關鍵的是,如果不想浪費50%的
內存,就需要額外的空間進行分配擔保,以因對被使用的內存中所有對象都是100%存活
的極端情況,所以,老年代不能使用複製算法

3.標記整理算法

過程:將所有存活的對象標記處來,全部整理到一端,剩下的部分內存全部置空

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章