1.引用计数法(不推荐)
每一个对象都会有一个引用计数器,引用一次+1,引用失败-1,当引用次数为0时,会将该对象回收
缺点:计数器维护麻烦,循环引用(两个对象互相引用)无法处理
可达性算法
2.复制算法
Eden - S0 - S1 - old
第一次引用时,复制到S0,第二次医用复制到S1,由 from 区 -> to区。谁空谁是to
(1)一般普通的GC之后,Eden差不多为空
(2)每次存货的对象,从from和Eden复制到to,当复制到to区,from区会清空,并与to交换;
(3)每幸存一次,年龄+1,当年龄>15(默认可改,但不能超过15)进入养老区
优点
没有标记和清除过程,效率高,无内存碎片
缺点
to区始终为空,需要双份空间,浪费资源
使用
Eden区对象存活率极低,基本使用一次就失效,所以推荐使用复制算法
3.标记清除算法
老年代使用,但会与整理压缩一起使用
①标记,扫描一次,对活得对象标记
0 1 0 1 0
②清除:再扫描一次,回收未标记对象
0 1 0 1 0
优点
不需额外的空间,标记两次,会浪费时间 时间换空间
缺点
①扫描两次,如果空间过大,耗时严重
②每次清除完,会将清楚地位置空出来,产生内存碎片
4.标记清除压缩算法
标记清除算法基础上,将标记对象华东道一侧
1 1 0 0 0
优点
减少标记清除缺点,无内存碎片
缺点
①扫描三次,耗时严重
②可以用于空间少,很少或者不经常使用GC的情况
小结
内存效率: 复制算法>标记清除算法>标记压缩算法
整齐度:复制 = 标记清除压缩算法 > 标记清除算法
利用率:标记清除算法 = 标记清除压缩算法 > 复制算法
年轻代
相对老年代存活低,使用复制算法 why:效率高,无内存碎片
老年代
区域大,存活率高,不经常GC 标记清除压缩算法