乐趣区

GC

对象被判定为垃圾的标准
没有被其他对象引用

判定对象是否为垃圾的算法
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 的条件

退出移动版