jvm垃圾回收器

哪些内存需要回收

  java堆中存放着几乎所有对象实例,垃圾收集器在堆进行回收前,判断哪些对象还存活着。

1.引用计数算法

      给对象添加一个引用计数器,当有一个地方引用它,计数器加1,引用失效时,计数器就减1,计数器为0的对象就不可能被使用。优点:算法简单,效率高,但当存货对象相互引用就解决不了。所以Java中GC没有采用引用计数法来管理内存

2.可达性分析算法

     以GC Roots对象作为起始点,从这些节点依次向下搜索,如果当前对象到GC Roots没有任何路径相连时,那么当前对象没有引用。

    可做GC Roots的对象1.java虚拟机栈中引用的对象 2.本地方法栈中引用的对象 3.方法区中的常量引用的对象 4.方法区中静态属性引用的对象。当对象不可达,并不是宣告对象死亡,还有对象进行最后自我救赎--finalize。java允许使用finalize方法在垃圾收集器将对象从内存中清楚之前做必要清理工作。这个操作中如果对象被重新引用,对象就可以活过来了。

     判断对象是否有必要执行该方法主要有以下两个依据:对象有没有覆盖finalize方法;对象已覆盖finalize方法,检查finalize方法是否被虚拟机调用过,如果已被调用,就不需要再次执行。

何时回收

    young gc触发条件似乎要简单很多,当 eden 区的内存不够时,就会触发young gc

full gc

1. old gen 空间不足

       当创建一个大对象、大数组时,eden 区不足以分配这么大的空间,会尝试在old gen 中分配,如果这时 old gen 空间也不足时,会触发 full gc,为了避免上述导致的 full gc,调优时应尽量让对象在 young gc 时就能够被回收,还有不要创建过大的对象和数组。

2. 统计得到的 young gc 晋升到 old gen的对象平均总大小大于old gen 的剩余空间

       当准备触发一次 young gc时,会判断这次 young gc 是否安全,这里所谓的安全是当前老年代的剩余空间可以容纳之前 young gc 晋升对象的平均大小,或者可以容纳 young gen 的全部对象,如果结果是不安全的,就不会执行这次 young gc,转而执行一次 full gc

3. perm gen 空间不足

     如果有perm gen的话,当系统中要加载的类、反射的类和调用的方法较多,而且perm gen没有足够空间时,也会触发一次 full gc

4. ygc出现 promotion failure

      promotion failure 发生在 young gc 阶段,即 cms 的 ParNewGC,当对象的gc年龄达到阈值时,或者 eden 的 to 区放不下时,会把该对象复制到 old gen,如果 old gen 空间不足时,会发生 promotion failure,并接下去触发full gc

如何回收

标记-清除算法

     标记清除算法分为”标记“和”清除“两个阶段:首先标记处所有需要回收的对象,在标记完成后统一回收所有被标记的对象。

它的不足有两个:1.效率问题,标记和清除两个过程的效率都不高。2.空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后的程序在运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

复制算法

      为了解决效率问题,”复制“算法出现了,将可用的内存划分为两块,每次只使用其中一块, 当这一块的内存用完了,就将还存活着的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。这样就不用考虑内存碎片等复杂情况。现在的商业虚拟机都采用这这种收集算法来回收新生代。根据研究表明,新生代中98%的对象都是”朝生夕死“的,所以新生代中将内存分为一块较大的Eden空间和两块较小的Survivor空间(from和to),每次使用Eden和其中一块Survivor,当回收时,将Eden和刚才用过的Survivor中还存活的对象一次性的复制到另外一个Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。

      Hotspot虚拟机默认使用Eden和Survivor的大小比例是8:1,也就是Eden占8,form和to各占1.当Survivor空间不够的时候,需要依赖老年代进行分配担保。在发生Minor GC之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象的总空间,如果大于,则此次Minor GC是安全的;如果小于,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。如果HandlePromotionFailure=true,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小,如果大于,则尝试进行一次Minor GC,但这次Minor GC依然是有风险的;如果小于或者HandlePromotionFailure=false,则改为进行一次Full GC。

标记-整理算法

     标记整理算法的“标记”过程和标记-清除算法一致,只是后面并不是直接对可回收对象进行整理,而是让所有存活的对象都向一段移动,然后直接清理掉端边界以外的内存。

分代收集算法

      当前商业虚拟机的垃圾收集都采用”分代收集“算法,其主要思想是将Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适合的收集算法。

      在新生代采用复制算法,上面已经讲过了。而老年代因为对象存活率高,没有额外空间为它进行分配担保,就必须使用”标记清理“或者”标记整理“算法来进行回收。

面试题

1.你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms,包括原理,流程,优缺点?

      串行垃圾收集器:收集时间长,停顿时间久(单线程收集器,它进行垃圾收集时,暂停其他所有工作的线程,直到收集结束)

      并发垃圾收集器:碎片空间多(使用多线程来通过扫描并压缩堆,可以大幅度压缩停顿时间)

      CMS收集器:主要基于标记-清除算法实现,使用多线程算法去扫描并发现未使用的对象进行回收,初始标记(标记GC Roots直接关联的对象)、并发标记、并发预清理、并发清除、并发重置.

      G1收集器:主要步骤:初始标记,并发标记,重新标记,复制清除(整理)它是“标记-整理”算法实现的收集器

      CMS的缺点是对cpu的要求比较高。G1是将内存化成了多块,所有对内段的大小有很大的要求

      CMS是清除,所以会存在很多的内存碎片。G1是整理,所以碎片空间较小

2..垃圾回收算法

    引用计数,增加一个字段来标记当前应用次数,引用计数为0就可以GC,但不能解决循环引用的问题

    可达性:通过一系列GC Root的对象作为起点,向下搜索,搜索所有没有与当前对象GC ROOT有引用关系的对象,这是对象就可以GC

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

推荐阅读更多精彩内容

  • 许多高级编程语言都带有自动垃圾回收特性,以将程序员从繁琐复杂的内存分配和释放工作中解脱。本文将概述常见的垃圾回收算...
    kelgon阅读 2,031评论 2 52
  • 作者:一字马胡 转载标志 【2017-11-12】 更新日志 日期更新内容备注 2017-11-12新建文章初版 ...
    beneke阅读 2,183评论 0 7
  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供...
    简欲明心阅读 89,286评论 17 311
  • 第一章 数据——人类建造文明的基石。 如果把资本和机械动能,作为大航海时代以来全球化的推动力,那么数据正成为下一次...
    竹子柳阅读 701评论 0 0
  • 听说现下流行一个话题,别人的什么细节给你留下深刻的印象,我也来献一杯羹。我想起了《细节决定成败》《细节决定成败合集...
    介愚阅读 441评论 0 1