码仔漫画:“你是什么垃圾?”(下)

码仔漫画:“你是什么垃圾?”(下)

码个蛋(codeegg)第 713 次推文

作者:iMononoke

博客:https://juejin.im/user/5c629a3051882562191755d8

前几天发了上篇:《码仔漫画:来自JVM的灵魂拷问:“你是什么垃圾?”(上)》

码仔漫画:“你是什么垃圾?”(下)

码仔漫画:“你是什么垃圾?”(下)

码仔漫画:“你是什么垃圾?”(下)

码仔漫画:“你是什么垃圾?”(下)

四种引用类型

对于GC来说,对象是否被应该回收的取决于该对象是否被引用。为了控制对象的生存周期,提供了四种引用方式,引用的强度从强到弱分别为:

强引用 -> 软引用 -> 弱引用 -> 虚引用

引用的作用

  • 方便Jvm进行垃圾回收

  • 方便开发人员使用

码仔漫画:“你是什么垃圾?”(下)

几种类型的继承关系

码仔漫画:“你是什么垃圾?”(下)

再比较下

码仔漫画:“你是什么垃圾?”(下)

码仔漫画:“你是什么垃圾?”(下)

码仔漫画:“你是什么垃圾?”(下)


怎么回收?

1. 标记清除法

这是GC算法的思想基础。将垃圾分为两个阶段:

  • 标记阶段。

    通过根节点,标记所有从根节点开始的可达对象,未标记过的对象就是未被引用的垃圾对象。

  • 清除阶段。

    清除所有未被标记的对象。

码仔漫画:“你是什么垃圾?”(下)

2. 复制算法

为了解决效率问题而出现的。

将原有的内存空间分为两块,每次只使用其中一块。

在垃圾回收时,将正在使用的内存中存活对象复制到未使用的内存块,然后清除使用的内存块中所有的对象。

码仔漫画:“你是什么垃圾?”(下)

3. 标记整理算法

过程与标记-清除算法一样,不过不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉边界以外的内存。

码仔漫画:“你是什么垃圾?”(下)
比较了下这三种算法~

码仔漫画:“你是什么垃圾?”(下)

最后一种,是上面三种的综合了~

4. 分代收集算法

现代商用虚拟机基本都采用分代收集算法来进行垃圾回收。其实是上面几种算法的结合。

垃圾回收主要是在Young(年轻代)和 Old(老年代)工作。

堆内存空间主要是这样分配的:

码仔漫画:“你是什么垃圾?”(下)

码仔漫画:“你是什么垃圾?”(下)

码仔漫画:“你是什么垃圾?”(下)

分代回收的过程是这样滴:

码仔漫画:“你是什么垃圾?”(下)

码仔漫画:“你是什么垃圾?”(下)

最后还有 堆内存分配与相关参数

码仔漫画:“你是什么垃圾?”(下)

码仔漫画:“你是什么垃圾?”(下)

码仔漫画:“你是什么垃圾?”(下)

码仔漫画:“你是什么垃圾?”(下)

码仔漫画:“你是什么垃圾?”(下)

码仔漫画:“你是什么垃圾?”(下)

漫画系列:

日问题:

再有问“是什么垃圾”,知道怎么做了嘛?

码仔漫画:“你是什么垃圾?”(下)

专属升级社区:《这件事情,我终于想明白了》 

码仔漫画:“你是什么垃圾?”(下)