目录
GC的概念
垃圾回收机制是一种自动的回收机制,它回收的内容位于方法区和堆内存中
我们知道堆中包括新生代、幸存区(from,to)、老年代、元空间。GC回收大部分都是新生代。
GC垃圾回收流程
这里我们再来回顾下GC的流程,第一次的垃圾回收会在Eden区做处理,存活下来的进入到幸存区,此时Eden区被清空。幸存区from和to的区分标准是谁空谁是to。第二次垃圾回收会把Eden区存活的对象放到to中,From上次保存的对象也放到to中。到此原来的from变成to,原来的to变成from。
默认情况下当一个对象经历了15次GC都没有死,就会进入到养老区。也可以通过-XX:MaxTenuringThreshold参数来调节这个参数

GC的算法
- 引用计数法
它会给堆中的每个对象计数。最少使用次数的对象会先被GC回收。
这种算法jvm中用的非常少了,因为每一个对象都有一个记数器,对象多了非常影响性能

- 复制算法
复制算法用于对象存活度低的新生区,它的含义是GC时伊甸区的内容给了幸存区,幸存区的to和from对象交换的原理。
它的好处是GC到幸存区后空间一份为二,from,要么to。没有内存碎片
它的坏处是极端情况下,对象100%存活,始终有一半的to空间是无法存储对象的。浪费了内存空间

- 标记清除法
复制算法会出现空间浪费的情况,标记清除法试图解决这个问题。标记的过程其实就是,遍历所有的GC Roots,然后将所有的 GC Roots可达的对象标记为存活的对象。
它的优点是:不需要额外的空间
它的缺点是:两次扫描会浪费时间,并且对一个个无序的小块标记,中间会产生内存碎片

- 标记整理法
压缩法在清除法的基础上又进行了一次扫描,把存活的对象进行了排序,解决了内存碎片问题,但多扫描一次增加了时间成本

GC算法的比较
内存效率(时间复杂度):复制算法>标记清除算法>标记压缩算法
内存整齐度:复制算法 = 标记压缩算法>标记清除算法
内存利用率:标记压缩算法>标记清除算法>复制算法
总结:GC是一个分代的垃圾回收机制,年轻代存活率低时候用复制算法,老年代存活率高适合于标记清除算法+标记压缩算法
3613

被折叠的 条评论
为什么被折叠?



