目录
1 被判定为垃圾的标准
没有被其它对象引用
2 判定对象是否为垃圾的算法
- 引用计数法
- 可达性分析算法
2.1 引用计数法
通过判断对象的引用数量来决定对象是否可以被回收
每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1。
任何引用计数为0的都可以被当做是垃圾。
优点
执行效率高(只需要查找出引用计数为0的即可),程序受影响小
缺点
当出现循环引用的时候(父对象有一个对子对象的引用,子对象又反过来引用父对象。或者出现两个对象相互引用),引用计数不可能为0,也就是不能被回收,可能造成内存泄露
比如:
2.2 可达性分析算法
通过判断对象的引用链是否可达来判断对象是否可回收
什么对象可以作为GC 的root对象
3 垃圾回收的算法
3.1 标记-清除算法(Mark and Sweep)
标记:从根集合进行扫描,对存活的对象进行标记。
清除:对堆内存进行线性遍历,回收不可达对象内存。
3.2 复制算法(Copying)适用于对象存活率低的场景(年轻代中),因为需要复制的对象少。年轻代与老年代后面会介绍到。
- 分为对象面和空闲面
- 对象在对象面中创建
- 存活的对象会被复制到空闲面
- 复制之后将对象面中所有对象全部清除
3.3 标记整理(Compacting)适合存活率高(例如老年代中)
标记:从根集合进行扫描标记存活的对象
清除:移动所有存活的对象,按照内存地址次序依次排列,然后将末端地址以后的所有对象清除
3.4 分代收集算法(Generational Collector)
年轻代、老年代、永久代?
年轻代:进可能快速收集生命周期短的对象
一般分为:一个Eden区,两个survivor区
年轻代回收演示(Minor GC):
对象在什么时候会进入老年代
1、当年龄到达默认最大值时,对象会晋升老年代。默认15,可通过该参数设置
2、Survivor中放不下的
3、新生成的大对象
分代收集算法特点:
**老年代:**存放生命周期较长的对象,使用标记-清理或标记-整理方法
Major GC 是清理永久代。
Full GC 是清理整个堆空间—包括年轻代和永久代。
Full GC比 Minor GC慢 ,但执行频率低
触发条件:
常用调优参数
分代收集的GC分类:
- Minor GC (年轻代中的垃圾收集,采用复制算法)
- Full GC 老年代中,由于对老年代的回收一般会伴随年轻代,所以叫做Full GC