垃圾回收之可达性分析

  • HotSpot JVM 架构图


    截图.png

垃圾回收介绍(Garbage Collection,GC),来源

Automatic garbage collection is the process of looking at heap memory, identifying which objects are in use and which are not, and deleting the unused objects. An in use object, or a referenced object, means that some part of your program still maintains a pointer to that object. An unused object, or unreferenced object, is no longer referenced by any part of your program. So the memory used by an unreferenced object can be reclaimed.

  • 判断对象生死
    怎样判断一个对象是否是垃圾,即怎样断定一个对象的生死。最常见的两种方法:引用计数,可达性分析-根搜索算法

1.引用计数
即每个对象被其他对象引用时会有几个计数标记,每被引用一次则计数+1,当引用计数为0时,表明该对象成为垃圾不在存活。该方法实现简单容易理解,但是改方法无法解决对象间循环引用的情况,当多个对象循环引用即使所有对象之后不被再使用,对象的引用计数也不会为0。

截图 (1).png

2.可达性分析,根搜索算法
思路就是通过一系列的“GC Roots”,也就是根对象作为起始节点集合,从根节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为引用链,如果某个对象到GC Roots间没有任何引用链相连,则改对象已"死亡"

截图 (2).png

1.虚拟机栈(栈帧中的本地变量表)中引用的对象
2.方法区中类静态属性引用的对象
3.方法区中常量引用的对象
4.本地方法栈中JNI(即一般说的Native方法)引用的对象

在程序运行过程中对象的引用关系一直在变化,会出现漏标或错标的问题。
最简单的一种方式是挂起应用程序stw(stop the world),然后进行根搜索并进行标记对象生死,但是在这种情况下(stw)挂起应用程序进行垃圾标记和回收必然会影响程序响应时间,引起卡顿等现象。另一种方式是把标记和回收分多个阶段进行:

1.初始标记:扫描gc root,少快-stw
2.并发标记:扫描gc root 以为的对象,多慢,会出现漏标和错标等问题
3.重新标记:扫描并发标记过程中出现的漏标错标对象,少快-stw
4.并发清理

  • 并发标记-三色标记法
    三色标记发顾名思义对象在并发标记过程中有三种状态或三种颜色,
    黑:表示对象已经被垃圾回收器访问过,且这个对象的所有引用都已经扫描过
    灰:表示对象已经被垃圾回收器访问过,但这个对象至少存在一个引用还没有被扫描过
    白:表示对象尚未被垃圾回收器访问过
    在标记完成阶段,只有黑色和白色状态,灰色是中间状态。黑色表示存活对象白色表示死亡对象
    截图 (3).png

并发标记会有两种后果:
1.原本消亡的对象标记为存活,这不是好事,但是不会带来严重的后果,无非会产生一定的浮动垃圾,可以容忍,下次垃圾回收是清理即可


截图 (4).png

如图,在并发标记完成时会有一些对象被标记为黑色(存活),但实际是已经已经不存活的对象。如在表发过程中,虽然B之后的对象被标记为黑色,但在标记完后A断开了B之间的引用关系。

2.原本存活的对象标记为消亡,程序正在使用的对象却被误标进行了垃圾清理,这会对应用程序带来灾难性的后果

截图 (5).png
截图 (6).png
截图 (7).png

在标记过程中,原本B到D的引用关系,修改为了A与D之间的引用关系,因为A已经被标记为了黑色,A到D的引用不会再被扫描,则D对象一直为白色,则会被误以为是死亡对象而被错误回收。

对象被误标记为白色对象的情况需要满足两个条件:

Wilson证明了,当且仅当以下两个条件同时满足时,会产生"对象消失"的问题,原来应该是黑色的对象被误标为了白色
条件一:赋值器插入了一条或者多条从黑色对象到白色对象的新引用。
条件二:赋值器删除了全部从灰色对象到该白色对象的直接或间接引用

所以要解决并发标记中对象消失,就需要破坏上面的任意条件,于是产生了两种解决方案,增量更新原始快照

1.增量更新


截图 (8).png

增量更新破坏第一个条件,当有赋值器插入了一条或者多条从黑色对象到白色对象的新引用时,黑色对象被重新标记为灰色对象,在重新标记时重新扫描。
2.原始快照


截图 (9).png

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

推荐阅读更多精彩内容