GC:垃圾回收器

2020-04-15  本文已影响0人  Robin92

Java VS C/C++

如何找到垃圾

一般有两种算法:

引用记数法:一个变量被引用多少次,有一个记数,这就是引用记数法。但它不能解决循环引用的问题。

Python 用的引用计数

根可达算法:从根对象开始搜。

根对象,总得来说,在程序运行的时候马上用到的对象,就是根对象:

根可达算法

GC 三种方法

GC 过程及方法

分代模型

分代模型 image.png

G1 及之前都是分代模型(参考下面的常见的垃圾回收器)
G1 是逻辑分代,物理不分代
G1 之前都是逻辑分代物理也分代

专业名词

变量的分配

TLAB 是这样的,如果无 TLAB 那每一个线程都需要在 Eden 区分配一部分空间,会发生争抢,所以规定每个线程在 Eden 区占有 1% 的自有空间,当占满了后再去占有其他空间。提高了效率。

何时进入老年代

总结一下

还有一种情况是 分配担保,是指在 YGC 期间,survivor 区空间不够用了,一些变量直接进入老年代。

变量生命周期

常见的垃圾回收器

image.png

术语:

  • STW,Stop-The-World,是指在垃圾回收时,让所有的线程停止运行。
  • Safe Point,是指线程停止的那个安全点。比如在上锁期间,就不是一个安全点,它会等到到安全点时停止线程。

上图解释

scavenge:清除污物,打扫。

CMS

CMS(Concurrent Mark Sweep) 是里程碑式的,因为在这之前清理垃圾时都是需要 STW 的,从这里开始,可以在清理工作时不进行 STW。

CMS 的流程有四步:

可以套一下上面 根可达算法 的图例,就清楚流程了。

CMS

图中一根黄线表示单线程,多根黄线表示多线程并发。

CMS 几乎未被广泛使用,虽然它是里程碑式的,但它的原因很大。
优:有并发标记的过程,所以不妨碍主程序的运行。
劣:

碎片很多会报 “Concurrent Mode Failure” 或 “PromotionFailed” 的错误。

问,一个网站,服务器 32 位,1.5G 的堆,用户反馈网站缓慢,公司决定升级,新服务器是 64 位,16G 内存,结果用户反馈十分卡顿,反不如初。为何?
答:因为内存变大了,大成天安门广场,GC 清理不过来了。


课后话:

G1、 ZGC 他们的区别主要在 并发标记(Concurrent Mark)阶段的算法不同

三色标记:黑、灰、白,白色回收。


附:参考 mashibing github 库文件

上一篇下一篇

猜你喜欢

热点阅读