jvm的垃圾收集算法和收集器

jvm的垃圾收集算法和收集器

垃圾收集算法

标记-清除算法

过程

算法成成2个阶段,"标记"和“清除”两个阶段:首先标记初所有需要回收的对象,在标记完成后统一回收所有被标记的对象。标记的位置在object header中。

应用范围
老年代

不足

效率问题

  • 标记和清除的过程的效率都不高。

空间问题

  • 标记清除后将会产生大量的的不连续内存碎片,空间碎片太多会导致后面大对象分配时,找不到足够的内存不得不提前触发另一个垃圾回收动作。

复制算法

  • 为了解决效率的的问题。
过程

它可以将内存划分为大小相等的两份,每次只使用一块。这块快要满了的将还存活的对象复制到另外一个区域。

应用范围
新生代

优点
  • 实现简单效率高 (只需要简单的移动指针,将复制的碎片全部都移到栈顶)
缺点
  • 需要牺牲一般的内存做复制,代价非常大

改良
IBM公司研究表明,新生代98%的对象都是“朝生夕死”,所以并不需要按照1:1来划分空间,而是将划分出一大部分Eden区和两块Survivor区(S0、S1虚拟机默认8:1:1),每次回收的时候,都是将Eden区和S0区复制到S1区。

分配担保(Handle Promotion)
  • 因为不能保证低于10%存活,如果超过10%存活,那么将导致S1区内存不够,所以需要其他内存(这里指老年代)进行分配担保。

标记-整理算法

过程

与“标记-清除算法”算法相同,但是后续步骤不是直接对标记对象进行清理,而是让向一端移动,然后清理掉端边界意外的内存。

应用范围
老年代

分代收集算法

  • 当代虚拟机都采用分级收集算法(Generational Collection)算法。将对象根据存活周期分成几部分。
    将java堆分成新生代和老年代。根据不同的年代采用最适当的收集算法。

Serial收集器

  • Serial收集器最近本的、发展历史最悠久的收集器,曾经(在JDK1.3.1之前是虚拟机新生代的唯一选择)
优点
  • 简单高效(与其他收集器的单线程相比),对于单个CPU的环境的来说,Serial收集器由于没有线程交互的开销,可以获得最高的单线程收集效果。
缺点
  • 单线成收集器,因为了垃圾收集-垃圾回收时必须暂停所有用户进程(Stop The World),会倒追计算机每运行1小时暂停5分钟。
参数
  • -XX:+ServivorRatio
  • -XX:+PretenureSizeThreshold
  • -XX:+HandlePromotionFailure

ParNew收集器

  • ParNew是Serial收集器的多线程版本。目前只能与CMS收集器合作
参数
  • -XX:+ServivorRatio
  • -XX:+PretenureSizeThreshold
  • -XX:+HandlePromotionFailure
  • -XX:+UseParNewGC 指定ParNewGC回收器

Parallel Scavaenge收集器

  • Parallel Scavaenge收集器是一个关注与吞吐量(Throughput)多线程收集器。
  • 这里的吞吐量 = (运行用户代码时间)/(运行用户代码时间+垃圾收集时间) 。是一个比值。
参数
  • -XX:MaxGCPauseMillis 大于0的毫秒数,收集器将尽可能保证内存回收话费的时间不超过设定值。
  • -XX:GCTimeRatio 介于0到100的整数,垃圾收集时间占总时间的比率。
  • -XX:+UseAdaptiveSizePolicy的开关参数。不需要手工指定新生代的大小(-Xmn),Eden和Servivor区的曲率(-XX:ServivorRatio),晋升老年代对象大小(-XX:PretenureSizeThreshold)

Serial Old收集器

  • Serial Old收集器是Serial收集器的老年代版本,它同样是一个单线程收集器,使用的“标记-整理”算法。

Parallel Old收集器

  • Parallel Old收集器是Parallel Scavaenge收集器 老年版本,使用多线程和“标记-整理”算法。

CMS收集器

  • CMS(Concurrent Mark Sweep)收集器是一中最短回收停顿时间为目标的收集器。
过程

初始标记(CMS initial mark)
并发标记(CMS concurrent mark)
重新标记(CMS remark)
并发清除(CMS concurrent sweep)

  • 其中,初始标记、并发标记这两个步骤仍然需要“Stop The World”。
  • 初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快。
  • 并发标记阶段进行GC Roots Tracing的过程。
  • 重新标记阶段则是为了修正并发标记期间因用户程序继续运作而导致变动的那一部分继续,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记时间端。

由于整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作,所以你,从总体上说CMS收集器的内存回收过程是与用户线程一起并发执行的。

缺点

CMS收集器对CPU资源非常敏感。

  • CMS默认回收线程数(CPU数量+3)/4,当CPU不足4个时,CMS对用户程序影响很大。当CPU大于4个时,并发回收时垃圾不少于25%的系统资源,并且随着CPU数量增加而下降。

CMS收集器无法处理浮动垃圾(Floating Garbage)。

  • 浮动垃圾因为CMS并发清理阶段依旧有用户线程在运行,也会产生垃圾,这部分垃圾称为浮动垃圾。
  • 浮动垃圾只能在下次GC的时候处理。
  • 可能会出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。
  • 所以不能在100%时开始垃圾回收。

解决办法

  • 提供了* -XX:CMSInitiatingOccupancyFraction的值来提高阈值

CMS是给予“标记-清除”的收集器,会产生大量碎片。

解决办法

  • CMS提供来一个-XX:+UseCMSCompactAtFullCollection开关参数(默认开启状态),用于在CMS收集器顶不住要Full GC的时候,启用合并整理。
  • 但是时间会变长,CMS另外提供一个参数-XX:CMSFullGcsBeforeCompaction(默认0),用于设置执行多少次不“标记压缩”之后执行一次“标记压缩”。

G1收集器

  • G1(Garbage-first)收集器是当今收集器技术发展的最前沿成功之一。在JDK7u4,Sun公司认为达到足够商用成都,移除了“Experimental”标示。
特点

并发与并行。

  • G1能充分利用多CPU,多核环境下的硬件优势,使用多个CPU来缩短STW时间。

分代收集

  • G1可以不需要其他收集器配合就能独立管理整个GC堆。

空间整合

  • G1整体是基于“标记-整理”算法实现的收集器。从局部(两个Region之间)上来看是基于”复制“算法实现的。
  • 这两种都不会产生内存碎片。

可预测的停顿

内存分配和回收策略

对象优先在Eden区分配

  • 虚拟机默认在Eden区进行分配

大对象直接进入老年代

  • -XX:PretenureSizeThreshold参数,大于这个设置值的参数会直接进入老年代,目的是可以避免在Eden区和Survivor区之间发生大量的内存复制。 PretenureSizeThreshold参数只对Serial和ParNew两款收集器有效。

长期存活的对象将进入老年代

  • -XX:MaxTenuringThreshold(默认15岁)* 每熬过一次Minor GC,年龄增加一岁。大概该设置的参数值,将进入老年代。

空间分配担保

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