描述
什么是垃圾回收
- 垃圾回收机制是一种自动的回收机制,它回收的内容位于方法区和堆内存中
堆的组成:
- 新生代
- 幸存区
- 老年代
- 元空间
垃圾回收流程
- 第一次的垃圾回收会在Eden区做处理,存活下来的进入到幸存区,此时Eden区被清空。幸存区from和to的区分标准是谁空谁是to。
- 第二次垃圾回收会把Eden区存活的对象放到to中,from上次保存的对象也放到to中。到此原来的from变成to,原来的to变成from
- 默认情况下当一个对象经历了15次GC都没有死,就会进入到养老区。也可以通过-XX:MaxTenuringThreshold参数来调节这个参数
算法
引用计数法
- 它会给堆中的每个对象计数。最好使用次数的对象会先被GC回收
- 这种算法jvm中用的非常少了,因为每一个对象都有一个记数器,对象多了非常影响性能
复制算法
- 复制算法用于对象存活度低的新生区。它的含义是GC时伊甸区的内容给了幸存区,幸存区的to和from对象交换的原理。
- 好处是GC到幸存区后空间一分为二,没有内存碎片
- 坏处是极端情况下,对象100%存活,始终有一半的to空间是无法存储对象的。浪费了内存空间
标记清除法
- 复制算法会出现空间浪费的情况。标记清除法试图解决这个问题。它的原理是扫描第一次标记哪些对象存活,扫描第二次标记哪些对象要被清除
- 优点:不需要额外空间
- 缺点:两次扫描会浪费时间,并且对一个个无序的小块标记,中间会产生内存碎片
标记压缩法
- 压缩法在清除法的基础上又进行了一次扫描,把存活的对象进行了排序,解决了内存碎片问题,但多扫描一次增加了时间成本。
算法比较
内存效率(时间复杂度):
- 复制算法>标记清除算法>标记压缩算法
内存整齐度:
- 复制算法 = 标记压缩算法>标记清除算法
内存利用率:
- 标记压缩算法>标记清除算法>复制算法
总结:GC是一个分代的垃圾回收机制,年轻代存活率低时候用复制算法,老年代存活率高适合于标记清除算法+标记压缩算法