-
标记——清除算法
(1) 最__基础__的GC算法
(2) 过程
先把需要回收的对象标记上,然后统一回收所有被标记的对象
(3) 问题
1° 标记过程和清除过程的__效率都不高__
2° 标记、清除之后会产生大量__内存碎片__,造成分配大对象是找不到空间,可能又会频繁诱发GC
-
复制算法
(1) 基础版本
将内存__等分__成两块,每次对象分配都__只用其中一块__,GC时把用的那块内存中还存活的对象复制到另一块中
(2) HotSpot中的进化版本
将内存分为三块,Eden:Survivor1:Survivor2 = 8:1:1,每次对象分配时,只使用Eden块和其中一块Survivor,然后GC时把存活的对象都复制到另一块Survivor中
注° 8:1:1的比例是经验数据,有时可能存在另一块Survivor装不下存活对象的情况,此时需要__依赖其他内存(老年代)进行分配担保__
-
标记——整理算法
(1) 算是__标记——清除算法的进化版__
(2) 过程
先把需要回收的对象标记上,然后用指针的方式,把存活的对象都对齐到一端,这样就不会出现内存碎片了
-
分代收集算法
(1) 先把Java堆的内存空间分为__新生代__和__老年代__
(2) 新生代的特点是每次都有大批对象诞生和死亡,并且有老年代作为__内存担保__,所以应该用__复制算法__
(3) 老年代的特点是对象存活率高,并且再没有额外的内存空间帮它担保,所以应该用__标记-清除算法__或__标记-整理算法__
chapter03_垃圾收集器与内存分配策略_3_垃圾收集算法
最新推荐文章于 2024-08-05 00:10:02 发布