对象被判定为垃圾的标准
没有被其他对象引用
判定对象是否为垃圾的算法
1. 引用计数算法
优缺点:
解释: 循环引用就是父类调用子类, 子类再调用父类, 这样循环调用, 计数永远不可能为 0,, 最后导致内存泄露, 程序变慢, 严重还可能系统崩溃。
2. 可达性分析算法
可作为 GCRoots 的对象
垃圾回收算法
第一种垃圾回收算法: 标记 - 清除算法
缺点:
第二种垃圾回收算法: 复制算法
好处和应用场景
适用于对象存活率比较低的情况, 因为从对象面复制到空闲面开销比较小
第三种: 标记 - 整理算法
标记整理算法适用于对象存活率比较高的情况下, 和复制算法相比, 标记整理算法是排序存活对象, 开销要比复制算法中的复制对象到空闲面要低得多
第四种: 分代垃圾回收算法
jdk8 及其以后的版本堆内存分为年轻代和老年代
年轻代存活率低, 采用复制算法, 老年代存活 率高采用标记 - 整理算法
分代收集的算法分为两种
年轻代垃圾回收的过程演示
年轻代有大量的对象的创建, 所以 MinorGC 也比较频繁。
假如说 Eden 能装 4 个对象,from survivor 和 to survivor 能装 3 个对象
第一次 Eden 满了进行一次 MinorGC, 有一个对象生存下来, 然后放在 from survivor 中, 并且年龄加 1。
第二次 Eden 满了, 然后有两个对象生存下来, 然后把 from survivor 和 Eden 中存活的对象都放进 to survivor 中, 并且年龄加 1。
第三次 Eden 满了, 然后有一个对象生存下来, 并且 to survivor 中有一个对象需要被清理, 然后把 to survivor 和 Eden 中存活的对象都放进 from survivor 中, 年龄加 1。
所以 from survivor 和 to survivor 是相对的
survivor 的对象达到 15 岁则进入老年代, 还有如果一个对象过大, 在 Eden 和 survivor 中没有这么大的连续空间来存放这个对象时, 该对象可以直接进入老年代
第一次 MinorGC
第二次 MinorGC
第三次 MinorGC
对象如何晋升到老年代
可以设置大对象的值, 一旦超过这个值就进入老年代
常用的调优参数
老年代
触发 Full GC 的条件