JVM 回收算法和回收器

概述

  1. 垃圾回收的方法:复制(年轻代,浪费空间但是快)、标记清除(CMS,同时CMS支持N次FGC后压缩一次,速度快但有内存碎片)、标记压缩(节省空间但延长STW,parallel回收器)、分代回收(G1)
  2. GC Roots(栈区和方法区):jvm栈、本地方法栈、静态成员变量的引用、常量池对象的引用
  3. 系统默认JVM 启动内存1/64,最大内存1/4,充分利用系统内存需要自己配置Xms Xmx
  4. 垃圾回收期的种类,回收器是针对老年代和年轻代的
  • Serial单线程模式,Serial + Serial Old,单线程,低CPU配置电脑上性能好,CMS promotion fail会切换S O
  • Parallel追求的是吞吐量最大,Parallel Scanvenge + Parallel Old,多线程,自动调节带区大小。适合那种报表型的应用,不用交互
  • Cms追求的最小停顿时间,parNew + Cms 多线程,适合交互类的应用,比如网站
  • G1 :把堆区分为多个相对独立的Rigion块,来实现更加灵活的垃圾回收,在满足设定的最长STW时间的限制下,实现最大吞吐量。G1各个区的大小是JVM自动调整的。参数MaxGCPauseMillis。适用机器配置很高的环境

G1回收器

吞吐量和最短停顿时间本来就互相矛盾,Parallel Old追求的是吞吐量,CMS追求的是STW的最短,而G1通过把堆分成多个相对独立的Region块,并行的进行选择性的回收,实现一个两者兼顾的回收器。

  1. G1类似于CMS,G1回收器支持用户并发操作,MajorGC在并发标记时允许用户线程同时进行业务操作。

  2. G1相对CMS而言,更加灵活,因为内部是多个Rigion组成,而且每个Rigion是独立的(Rigion之间对象的相互引用记录在Remembered Set里面),所以可以根据用户设定的允许最长停顿时间,在一次MajorGC的过程中只回收部分Rigion(回收空间价值最高而经验推算的时间成本又最低的Rigion块,比如Rigion1对象活跃度10%,Rigion2对象活跃度50%,那么优先回收Rigion1块),这是CMS无法做到的,CMS的老年代是完整的一块内存,要GC的话,就必须整个老年代全部GC,而整个老年代全部GC的话,停顿的时间就会相对更长。年轻代来看,也更加灵活,因为年轻代的Eden区和S区的Rigion块数量是动态调整的。

  3. G1相对CMS而言,因为采用的是复制算法,所以没有内存碎片的产生。避免了堆中大对象因为没有足够的连续的内存空间而触发MajorGC的情况。其实CMS之所以使用标记清除算法,是为了减少压缩垃圾过程时的STW,因为G1可以做到部分而不是所有Rigion块的GC,所以可以在预测的时间内完成复制操作。

  4. G1的适合大内存的JVM环境。因为采用复制的算法(YGC和MajorGC都是复制),所以需要有一定的空闲内存块来存储复制来的对象,空间利用率低。而且每次GC都不是完整的GC,需要该Region块的活跃度低于一定标准,这个Region块才会发起回收,所以一些活跃度高的内存块里面的垃圾对象不会被回收掉,默认堆内存使用率达到45%的时候,就开始FullGC。

  5. G1适合多CPU的JVM环境。因为传统的回收器都是3个内存块,而G1默认是2000多个相对独立的内存块,在GC几乎所有的过程中,Region块都是高度并行化的进行回收,而且还有在并发标记阶段支持用户并发性的业务操作,所以对CPU的要求较高

  6. G1的灵活性还在于能够根据设置的STW时间,动态调整各个分代的内存占比,有点类似于Parallel Old,但是和CMS是不同的。

G1回收器FullGC回收过程

  1. 初始标记,STW,分为老年代和年轻代两部分。先会触发一次YGC(排除掉年轻代对老年代有引用,但是该年轻代对象已经死亡的情况),然后再对Survivor to区进行遍历(确保所有的年轻代的对象都是活的,因为经历了一次YGC),查找并标记S区对象对老年代的直接引用的所有老年代对象(这里是直接引用,比如Survivor to区A对象,引用了老年代的B对象,就标记B对象,虽然B对象还可能引用了C、D、E对象)。第二部分是针对老年代,标记老年代中所有GC Roots直接引用的对象。
  2. 并发标记,根据可达性分析,找到所有GCRoots的对象引用,一层一层的标记,这个时候没有STW,用户线程正常执行。
  3. 最终标记,STW,修正并发标记期间的对象关系变更,根据Remembered Set Logs,来修改Remember Set,该阶段可以多个线程并行
  4. 筛选回收,STW,会跟踪各个Rigion里面的垃圾堆积的价值大小(比如需要回收的对象的空间大小以及回收所需时间的经验值)排序,根据用户设定的停顿时间,回收特定Region,因为每个Region块都有独立的Remembered Set,所以每个Region可以独立的进行回收,也就是多个Region块并行多线程的垃圾回收。

G1回收的细节

  1. 当执行垃圾回收时,G1以类似于CMS回收器的方式运行。G1执行一个并发的全局标记阶段,以确定整个堆中对象的活跃度。
  2. G1使用一个暂停预测模型来满足用户定义的暂停时间目标并基于指定的暂停时间目标选择回收的区域数量
  3. G1因为经常性的不完整GC,活跃度高的内存块GC的会更晚,而且需要有空闲的Region来实现复制,进行垃圾回收的时机更早,默认在堆内存使用率达到45%时就会开始垃圾回收。这体现了G1(Garbage-First/垃圾回收优先)这一名字的含义。至于活跃度多低才会进行回收,则是由G1决定的,G1会调整自己的回收策略来尽可能满足用户设置的最大STW时长。
  4. 每个Rigion都有一个Remembered Set,来纪录Region块之间的对象引用,RSet使得区域并行独立的回收成为可能。当程序发生写操作的时候,会判断相关的引用是否涉及到跨Region的引用,比如Rigion0当中,A对象之前是引用Rigion0中的B对象,现在执行程序,A对象被重新赋值,引用了Rigion1中的C对象,那么在Rigion1的Remembered Set当中就要纪录,否则Region1在GC的时候,会把C对象直接回收了,通过读取自己的Remembered Set知道C对象被Region0种的A对象引用,这样既避免了全堆的扫描,又实现了分块管理。
  5. FullGC触发的时机是内存使用率达到一定的比例,默认45%
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343