垃圾回收机制

2021-08-18  本文已影响0人  sun_hl

1)问什么是垃圾

一般来说没有被引用的对象就是垃圾,就是要被清除, 有个例外如果几个对象引用形成一个环,互相引用,但根访问不到它们,这几个对象也是垃圾,也要被清除。

2)如何检垃圾

垃圾回收策略:

1、垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记(当然,可以使用任何标记方式)。

2、然后,它会去掉运行环境中的变量以及被环境中变量所引用的变量的标记

3、此后,依然有标记的变量就被视为准备删除的变量,原因是在运行环境中已经无法访问到这些变量了。

4、最后,垃圾收集器完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间。

缺点:无法解决循环引用:
要解决循环引用的问题,最好是在不使用它们的时候将它们手动设为空。

几种垃圾回收算法

一种算法是标记 标记-清除 算法,还想说出不同的算法可以参考这里

1、 标记-清除算法 Mark-Sweep GC

分为两个阶段:

优点
缺点
2、标记整理(或标记压缩)

和“标记-清除”相似,不过在标记阶段后它将所有活动对象紧密的排在堆的一侧(压缩),消除了内存碎片, 不过压缩是需要花费计算成本的。如下图过程,标记后需要定位各个活动对象的新内存地址,然后再移动对象,总共搜索了3次堆。

优点
缺点
3、引用计数 Reference Counting

引用计数,就是记录每个对象被引用的次数,每次新建对象、赋值引用和删除引用的同时更新计数器,如果计数器值为0则直接回收内存。 很明显,引用计数最大的优势是暂停时间短

优点
缺点
4、 GC 复制算法

将堆分为两个大小相同的空间 From 和 To, 利用 From 空间进行分配,当 From 空间满的时候,GC将其中的活动对象复制到 To 空间,之后将两个空间互换即完成GC。

优点
缺点
5、分代回收

详见链接:https://blog.csdn.net/qq_41257129/article/details/104199725

出发点:大部分对象生成后马上就变成垃圾,很少有对象能活的很久

新生代 = 生成空间 + 2 * 幸存区 (使用复制算法)
老年代 (使用-清除算法)

对象在生成空间创建,当生成空间满之后进行 minor gc,将活动对象复制到第一个幸存区,并增加其“年龄” age,当这个幸存区满之后再将此次生成空间和这个幸存区的活动对象复制到另一个幸存区,如此反复,当活动对象的 age 达到一定次数后将其移动到老年代; 当老年代满的时候就用标记-清除或标记-压缩算法进行major gc

缺点:只能使用堆内存的一半。
上一篇 下一篇

猜你喜欢

热点阅读