一文读懂GC

什么是垃圾?

new student(); //TODO 没有任何引用指向对象

如何定位垃圾?

  • 引用计数(ReferenceCount)
    简单理解:每有一个引用指向时加一,每有一个引用指向消失时减一,当指数为零时为垃圾。

  • 可达性分析算法(RootSearching)
    简单理解:从根对象(可以理解为在main方法中创建的对象)开始往下找,找不到的为垃圾

常见的垃圾回收算法

  • 标记清除(mark sweep)
    标记清除.png

标记出来可回收的对象,然后进行回收
长时间运行会产生大量的垃圾,会导致整个内存一块能用一块不能用,大量的碎片化,会导致没有办法装大对象

  • 拷贝(copying)

    拷贝.png

    不管多大内存,将内存一分为二,把找到的所有垃圾复制到另一半空间中,然后将另一半空间全部回收
    效率很高,但是太浪费空间了,不管多大的空间,有一半浪费了

  • 标记压缩(mark compact)

    标记压缩.png

    一边找,一边标记,一边整理
    效率偏低

垃圾回收器分类

  • 分代模型
    分代模型.png
  • 分区模型
    分区模型.png

十种垃圾回收器

垃圾回收器.png

以上图为例,左边两两上下配合使用的都是分代模型,右边的为分区模型

JDK最早诞生了Serial(单线程回收),随着软硬件的不断发展,为了提高效率,诞生了Parallel Scavenge(多线程回收)CMS(并发回收)自JDK1.4版本之后出现的并发回收,为了配合CMS,诞生了ParNew,由于CMS存在着浮动垃圾、remark阶段从根开始扫描、调优难等问题,在JDK1.8出现了G1 ,G1与CMS都是采用的著名顶顶的三色标记算法

Serial GC

Serial是最早诞生的单线程垃圾回收器,所以在GC进行回收的时候会进行长时间的STW(stop-the-world),如果可以忍受,可在单CUP机器使用,具体工作原理下图所示:

Serial.png

Parallel GC

Parallel 是多线程的垃圾回收器,可以理解为Serial的升级版,由多个GC线程进行垃圾回收,比之前的Serial效率好


parallel.png

CMS GC

CMS全程Concurrent Mark Sweep(并发标记清除),分别有初始标记(STW)、并发标记(一边处理业务线程,一边进行标记)、重新标记(STW)、并发清理(业务线程开始运行),这个处理流程是有好多个阶段的,不是一个线程上来就都处理完了,而是有多个线程在处理,可能一个线程只标记了一半就停止了,过了一会再从上次标记的位置开始标记(不是从头开始标记,如果是从头开始标记,CMS还有啥用),整个标记过程为三色标记算法(下面会有介绍此算法),对于算法并发标记所产生的漏标处理,CMS采用了remark进行从新标记(后面会有介绍)


介绍GC的时候提到了CMS有浮动垃圾,介绍一下何为浮动垃圾
比如在标记的过程中当前对象标记了不是垃圾,标记完成之后,当前对象的指向没了,就产生了真正的垃圾被标记为有用的对象,这就是浮动垃圾。不过没有多大的影响,因为这次清理不掉,下次清理的时候一定会清理掉

CMS.png

G1 GC

G1也是并发标记,与CMS使用同样的标记算法(三色标记算法),对算法产生漏标的解决方案与CMS不同,后面会有介绍,CMS号称可以处理几十G内存,G1号称处理上百G内存


image.png

分代模型 - 年轻代算法

对象的产生到消失的过程.gif

如上图所示:

  1. 对象的产生首先进入的Eden区
  2. 然后由垃圾回收执行一次之后,无法回收,拷贝到s1,对象年龄增长一岁,回收Eden
  3. 第二次垃圾回收,会查看Eden和s1,发现还是不能进行回收,拷贝到s2,对象年龄增长一岁,回收Eden和s1
  4. 第N次垃圾回收,发现没有办法回收的对象年龄超过阈值(-XX:MaxTenurigThreshold )时,拷贝到老年代

按理来说,拷贝算法是不管内存多大,将内存一分为二,但是此处为啥要一份为三呢?
因为经过统计,大量新生代对象进入内存,垃圾回收器工作一两次,会回收百分之九十的对象,此处多出一块伊甸园区,就是为了存放新产生的对象,上面所描述的流程可以看出,每次只占用百分之十的内存,这就效率很高了

三色标记算法

三色标记.png

如上图所示,对象会被分为三种颜色:黑色、灰色、白色
黑色: 从根节点开始往下标记,所有子对象都被标记过以后,根节点变为黑色
灰色: 自己标记完成了,但是下级还没来得及标记
白色: 还没有被标记到的对象
在并发标记的过程中,因为标记期间业务线程还在继续跑,对象间的引用可能发生变化,漏标的情况就有可能发生。

漏标的产生

如上图,在标记到B的时候,GC线程终止了,然后业务线程执行,取消了B和C的引用,A指向了C,这个时候GC线程开始执行,发现B是灰色的,向下找子集的时候,发现是空的,因为A是黑色的,他不会继续向下找,这个时候C会被当作垃圾清除,实际上A还在指向C,这就是所谓的漏标

漏标处理 - 增量更新

首先解释一下写屏障,此处的屏障代表:在代码执行前和执行后加入一段代码,类似与AOP

当JVM监控到有白色指向黑色的时候,通过写屏障会把黑色变为灰色

漏标处理 - SATB(快照)

当灰色对象和白色对象的引用消失的时候,会把这个记录下来,下次扫描的时候,会查看有没有黑色引用指向它

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容