前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM - G1收集器、Region、停顿时间模型、垃圾回收(建议收藏)

JVM - G1收集器、Region、停顿时间模型、垃圾回收(建议收藏)

作者头像
冰河
发布2022-03-29 12:46:36
1.1K0
发布2022-03-29 12:46:36
举报
文章被收录于专栏:冰河技术

大家好,我是冰河~~

今天,我们继续学习JVM相关的知识,今天给大家分享一篇关于G1收集器的文章,好了,不多说了,直接进入正题

Region

使用G1收集器时,java堆的内存会划分为多个大小相等的独立区域(Region),Region中也有新生代和老年代的概念,但是新生代和老年代不再是物理隔离的,它们都是一部分Region(不需要连续)的集合.

如下图所示:粉色的代表新生代,没有字母的是eden,有s的是survivor ,老年代是浅蓝的O,还有一个H是humongous,也是老年代。

我们在《JVM堆内存分配机制(建议收藏)》提过,大对象直接进入老年代,这个humongous就是存储大对象的,也就是说如果对象内存大小大于Region的一半大小,那就会给一个专门的Region存放,如果对象大于一个Region的大小,那就用多个Region存放。

我们只画了16个Region,并不是说堆只分配了16个,在没有用-XX:G1HeapRegionSize去指定的情况下,默认是2048个,Region的个数必须是2的倍数,每个Region的大小在1到32M之间。

新生代的大小在5%到60%之间,可以通过-XX:G1NewSizePercent=5-XX:G1MaxNewSizePercent=60来设置。

停顿时间模型

G1的另外一个特点,就是建立可预测的停顿时间模型。G1跟踪各个Region的回收价值,并在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region,保证了在有限的时间内获取尽可能高的收集效率,停顿时间默认200ms,用-XX:MaxGCPauseMillis设置。

比如下图,第一个新生代的Region回收10M需要5ms,第二个新生代的Region回收20M也只要5ms,第三个新生代的Region回收10M却需要10ms,如果指定他需要5ms内回收20M的垃圾,他会直接去回收第二个新生代的Region,而不是回收第一个和第三个新生代的Region。

垃圾回收

新生代回收

上面提过,新生代的内存空间最多占用60%,当60%的空间用完的时候,就会触发新生代的回收。新生代的回收是用复制算法的,与之前不同的是,他会考虑到停顿时间。

老年代回收

老年代回收分为:初始标记、并发标记、最终标记、混合回收

前面三个阶段跟《JVM - CMS垃圾收集器(建议收藏)》的前面三个类似。

混合回收,是说他并不会仅仅回收老年代的垃圾,也会回收新生代的垃圾,他会根据停顿时间,尽可能多回收Region。

由于在停顿时间内回收的垃圾可能不会很多,所以这个阶段会进行多次的混合回收,默认是8次,可以通过-XX:G1MixedGCCountTarget设置。

如果混合回收的时候,发现Region仅占有5%了,那他就会停止回收,不会一直回收8次。

混合回收的基于复制算法的,所以大对象的复制会比较耗时,如果某个老年代的Region超过85%的对象是存活的,那他不会被回收,通过-XX:G1MixedGCLiveThresholdPercent设置。

好了,今天就到这儿吧,我是冰河,我们下期见~~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 冰河技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Region
  • 停顿时间模型
  • 垃圾回收
    • 新生代回收
      • 老年代回收
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档