在老年代中因爲對象的存活率很是高,內存中對象100%存活的極端狀況複製算法就不合適了。
根據老年代的特色,高人們提出了另外一種算法:標記/整理算法。從名字上看,這種算法與標記/清除算法很像,事實上,標記/整理算法的標記過程任然與標記/清除算法同樣,但後續步驟不是直接對可回收對象進行回收,而是讓全部存活的對象都向一端移動,而後直接清理掉端邊線之外的內存。
回收前:
回收後:
回收後可回收對象被清理掉了,存活的對象按規則排列存放在內存中。這樣一來,當咱們給新對象分配內存時,jvm只須要持有內存的起始地址便可。
標記/整理算法不只彌補了標記/清除算法存在內存碎片的問題,也消除了複製算法內存減半的高額代價,可謂一箭雙鵰。
缺點,標記/整理算法的缺點就是效率也不高,不只要標記存活對象,還要整理全部存活對象的引用地址,在效率上不如複製算法。