先看看下面的一个图片,看完再谈算法:
垃圾回收机制主要是回收堆内存
堆内存又分为四个区域:eden、s0、s1、老年代(前面三个称为新生代),垃圾回收主要回收新生代,因为频繁new出来的对象会慢慢重新生代转移到老年代,老年代很少会被回收。
在理解垃圾回收机制算法之前必须先了解什么是根搜索算法,不然就是盲目的懂。稍微深挖一点就gg了。
GC ROOTS:指栈和方法区中引用的对象(或者说是常量和静态的对象)
根搜索算法:以GC ROOTS为起点往下搜索,所有应用到的对象会生成一个应用链,在应用链中没用的对象称为垃圾对象,活跃的称为有用对象。
垃圾回收机制的算法:
1、标记-清除:jvm第一次扫描所有实例的时候根据根搜索算法将活跃的对象进行标记,再次扫描的时候将未标记的进行清除。但是清除完毕会有很多的内存碎片。
2、复制:将标记过的对象申请一块新的内存空间,然后移入新的内存空间,再清理掉之前的内存空间,这样解决了内存碎片问题(会有隐藏问题:当内存很大时候申请的内存空间不足会对jvm造成很大影响)
3、标记-整理:实际是对标记清除的优化,即:将标记清除后的内存进行整理然后统一向一端移动,这样成本会比较高,但是解决了标记清除中内存碎片的问题
4、分代回收:重点在这里,目前jvm的垃圾回收主要是分代回收。下面细说一下,不要怕啰嗦,搞懂最重要
年轻代:【复制算法】新new出来的对象都是在年轻代里面的,这里的垃圾最多,根据GC ROOTS根搜索算法得到一个应用链后,将标记过的内存对象统一进行复制存放另一内存区域,然后将其余的清除掉,快而省事
老年代:【标记整理算法】老年代中的对象都是年轻代经过标记之后统一放入的,他的生命周期比较长,经过了很多次的标记清除仍然存活,因为没有多余的内存进行分配,所以使用标记整理或者标记清除算法。
原文:https://www.cnblogs.com/sunxuesong/p/11299619.html