jvm垃圾回收算法

前言

java 相较于 c、c++ 语言的优势之一是自带垃圾回收器,程序开发人员不用手动管理内存,内存的分配和释放完全由 gc (Garbage Collector) 来做,极大地提高了软件开发效率及程序健壮性(手动管理内存容易造成内存泄漏)。凡事皆有两面性,java gc在给我们带来内存管理便捷性的同时,也面临 STW (Stop The World) 影响程序吞吐的缺陷。作为 java 开发人员,只有深入理解 jvm 垃圾回收的机制,才能在程序性能出现瓶颈时,更好的对程序进行优化。笔者通过拜读《深入理解java虚拟机》,总结书中内容,给大家分享下java虚拟机常见的垃圾回收算法。

垃圾确定

在垃圾回收之前,jvm 需要确定哪些对象已死,即需要当做垃圾被回收。垃圾确认的方法传统的有引用计数法:用一个引用计数器来标记对象当前的引用次数,当引用计数为0时,对象可回收。这种方法有个弊端是无法解决循环引用的问题,如两个对象相互引用则它们永远不会释放。另外一种方法是可达性分析算法,目前主流的语言(java、c#、golang等)都是采用这种方法来判定一个对象是否存活。可达性分析算法的思路是:将一系列根对象作为起点,沿着这些起点向下搜索,搜索经过的所有路径成为引用链,没有在引用链中的对象则为不可达对象,这类对象会被判断为可回收对象。可达性分析图如下:


可达性分析

标记-清除算法(Mark-Sweep)

标记清除算法是最基础的收集算法,顾名思义,算法分为两个阶段:首先标记需要回收的对象,然后统一回收所有被标记的对象。这种垃圾回收算法比较简单,但是存在两个不足之处:一个是效率问题,标记和清除都需要扫描整个内存空间的对象,效率较低;另一个是标记清除后会产生大量的内存碎片。标记-清除算法流程如下所示:


标记-清除算法

复制算法

为了解决上面的效率和内存碎片问题,有人提出了“复制”算法,它的思路是将内存一分为二,每次分配对象时只使用其中一半内存空间,当一块内存空间用完时,就将该块内存空间上存活的对象复制到另外一块内存上,然后将已使用过的内存空间一次清理掉,这样每次只对一半的内存进行回收,同时也解决了内存碎片的问题。同样,复制算法也有很明显的缺点:1. 牺牲了一半的内存空间,内存利用率最大也就50%;2. 当内存中存活的对象较多时,会进行大量的复制操作,效率会较低。复制算法的执行过程如下所示:


复制算法

标记-整理算法(Mark-Compact)

复制算法在存在大量存活对象的情况下效率低下,更关键的是50%的内存空间得不到利用,如果存活对象过多,内存空间可能不够,则需要额外的空间作为担保,因此,对于老年代不适合使用这种算法(新生代有老年代做担保)。
因此,根据老年代的特点,有人提出了“标记-整理”算法,标记-整理算法和标记-清除算法的第一步相同,即对所有需要回收的对象进行标记,不同的是,标记-整理算法在第二阶段并不是直接对可回收的对象进行清理,而是将所有存活的对象向一端移动,然后一把清理掉存活边界之外的内存。这种算法结合了标记-清除和复制算法的思想,即未浪费内存也避免了内存碎片的产生。“标记-整理”算法如下所示:


标记-整理算法

分代收集算法

分代收集并没有什么创新之处,这种算法只是将jvm堆内存分为不同的区域,再根据区域的特点采用不同的垃圾回收算法。一般分为新生代和老年代,新生代在再细分为Eden和Survivor区(8:1),在新生代中,对象的存活率低,因此采用“复制”算法,将Edian区存活的对象复制到Survivor区,而老年代中对象存活率高且没有额外的中间做担保,因此采用“标记-清除”或者“标记-整理”算法来进行垃圾回收。

总结

本文抛砖引玉,介绍了目前主流的垃圾回收算法的原理并未对主流的垃圾回收器的实现就行剖析,更详细的细节可以研读《深入理解java虚拟机》。笔者后续将分享主流的jvm实现原理,同时欢迎大家多多交流。

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

推荐阅读更多精彩内容