理解G1收集器

理解G1收集器G1这个名字是怎么来的collecttheregionswiththeleastlivedatafirst(GarbageFirst).G1适合什么情景多核多CPU而且大内存大内存要求低停顿G1如何实现-XX:MaxGCPauseMillis所设置的目标?首先这个目标是个软指标。对于新生代来说,过G1自动调整新生代的大小。对于老年代来说,每次MixedG…

大家好,又见面了,我是你们的朋友全栈君。

G1这个名字是怎么来的

collect the regions with the least live data first(Garbage First).

G1适合什么情景

  1. 多核多CPU而且大内存
  2. 大内存
  3. 要求低停顿

G1如何实现-XX:MaxGCPauseMillis所设置的目标?

首先这个目标是个软指标。

  1. 对于新生代来说,过G1自动调整新生代的大小。
  2. 对于老年代来说,每次Mixed Garbage Collecttion的时候回收的Rigion个数(基于Mixed Garbage Collection的目标次数,每个Region中的存活对象百分比,以及堆全局的垃圾比例)

G1如何实现避免碎片

无论是新生代还是老年代,使用复制算法。

将一批Region(被称作Collection Set,也就是CSet)复制到另外一批Region中来实现的。

如何避免可达性分析扫描整个堆?

名字叫做Remembered Sets(简称RSets) 每一个Region都有自己的RSets。用来记录对自己Region内对象的引用。

Collection Sets or CSets the set of regions that will be collected in a GC. All live data in a CSet is evacuated (copied/moved) during a GC. Sets of regions can be Eden, survivor, and/or old generation.

Remembered Sets or RSets track object references into a given region. There is one RSet per region in the heap. The RSet enables the parallel and independent collection of a region. The overall footprint impact of RSets is less than 5%.

在什么时机进行Mixed Garbage Collection

在堆的使用率达到-XX:InitiatingHeapOccupancyPercent所设置的使用率时。

那这个使用率具体的计算其实并非是整个堆的内存使用率,而是老年代使用的内存/整个堆内存

那做这个判断的时机是:每次Young GC结束的时候

为什么这么做,因为老年代空间中的使用内存发生变化只有一个情形:Young GC的时候。 所以在这个时候判断是最合理的。

其实是整个G1收集器总是在两种状态之间切换

  • young-only
  • space-reclaimation

那顾名思义,young-only就是只有新生代垃圾回收,有一部分垃圾就会不停地被送入老年代。 而space-reclaimation这个词是从老年代的角度来说的。就是开始重新回收老年代的垃圾。

那当young gc结束,发现堆内存已经达到了阈值的时候,就会开启一个既不是young gc也不是mixed gc的一个过程,叫global concurrent marking

这个所谓global concurrent marking的第一步就是叫initial mark,这一步是STW的。 然而Young GC也是需要做跟initial mark基本相同的处理的,就是找GC Roots直接的引用。所以,这里就公用了。导致initial mark事实上是Young GC的一部分。

global concurrent marking之后,如果判断需要进入space-reclaimation阶段,才会接下来进行mixed gc。

什么是global concurrent marking

是由young gc触发的一系列处理。 分为5个步骤。

  1. initial mark(STW)

    找到GC Roots直接引用的Region(限于Survivor区)。注意并不是对象 这其实是Young GC的一部分

  2. root region scaning

    扫描第一步中找到的Region(Survivor区中的),找到对老年代中对象的引用

  3. concurrent mark

    就是用可达性分析算法扫描所有Region

  4. re-mark(STW)

    标记那些在concurrent mark阶段发生变化的对象

  5. clean up(Partly STW)

    这最后一步最具有迷惑性。好像最后一步就进行垃圾回收一样。其实不是的。

    • 标记死对象,标记哪些存活率最低的region,来让后面的mixed gc来回收
    • 因为有了死对象,擦洗RSets
    • 把空Region送回free list。

G1都有哪些STW处理

⭕️young gc

因为是复制算法 这个复制的过程是STW的。另外提一嘴,这个过程是多线程完成的。

⭕️mixed gc

因为也是采用复制算法。 需要注意的是,mixed gc也包括对新生代的收集。

⭕️global concurrent mark中的initial mark、remark、部分clean up

既然有CMS,为什么要选择G1

原因

  • STW更加可控
  • 由于采用了标记-整理算法,不会产生内存碎片

Humongous Objects的分配和回收

大于Region的空间的一半的算Humongous Objects。

Humongous Objects被分配在Humongous Region,直接在老年代。

这个回收不在mixed gc。

而是在global concurrent marking的最后一步:clean up中。

G1调优

-XX:MaxGCPauseMillis

最大STW时间。这个参数设置的逻辑是最大停顿时间和吞吐量的平衡 因为如果这个参数设置过小,那么GC就会频繁,吞吐量会降低。

-XX:InitiatingHeapOccupancyPercent & -XX:+G1UseAdaptiveIHOP

InitiatingHeapOccupancyPercent简称IHOP

-XX:+G1UseAdaptiveIHOP是默认值,也就是说IHOP是adaptive的

-XX:InitiatingHeapOccupancyPercent是初始值

Full GC的调优

Full GC的例子

  1. 跟CMS一样,浮动垃圾产生的溢出

    增加堆大小 或者增加-XX:ConcGCThreads

  2. 垃圾晋升失败

    方法就是提升-XX:G1ReservePercent同时同比例地增加堆大小。 或者提前启动标记周期:减少-XX:InitiatingHeapOccupancyPercent

转载于:https://juejin.im/post/5bb838486fb9a05d11179865

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144995.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Shiro面试题(二十道)[通俗易懂]

    Shiro面试题(二十道)[通俗易懂]SecurityManager才是实际的执行者。Realm:域,shiro从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;Shiro提供了CredentialsMatcher的散列实现HashedCredentialsMatcher,和PasswordMatcher不同的是,它只是用于密码验证,且可以提供自己的盐,而不是随机生成盐,且生成密码散列值的算法需要自己写,因为能提供自己的盐。..

    2022年10月14日
    4
  • cmd不能切换盘符_cmd cd到d盘切换不过去

    cmd不能切换盘符_cmd cd到d盘切换不过去一开始输入cdd;一直无效 经过查找通过输入cd/dd:成功切换盘符

    2022年9月27日
    3
  • IDEA创建javaweb项目过程[通俗易懂]

    IDEA创建javaweb项目过程[通俗易懂]注意不能用社区版的idea哦,只能用企业版的创建方式有两种第一种是手动创建第二种是使用idea自带的maven骨架创建其实二者差别不大,所以这里只介绍第一种,让我们来试试吧~创建web项目首先新建一个文件夹,等下我们新建的项目就放在这个文件夹里我们给它取名test_maven(但其实并不是用maven创建)File->New->Module选择maven,注意不勾选create选项,然后next起名字,Finish然后就基本创建好啦,但是这里我们还缺少web的配置文

    2022年9月14日
    2
  • JAVA学习路线(最全)[通俗易懂]

    JAVA学习路线(最全)[通俗易懂]JAVA学习路线

    2022年5月13日
    45
  • DHCP协议简述

    DHCP协议简述DHCP(DynamicHostConfigurationProtocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段,在RFC2131中有详细的描述。DHCP有3个端口,其中UDP67和UDP68为正常的DHCP服务端口,分别作为DHCPServer…

    2022年5月24日
    45
  • python中copy.deepcopy_Python eval

    python中copy.deepcopy_Python eval仅出于教育目的,我尝试实现copy.deepcopy()的克隆函数。在在玩了一番代码并在谷歌上搜索之后,我想出了以下函数:defmy_deepcopy(data):ifisinstance(data,dict):result={}forkey,valueindata.items():result[key]=my_deepcopy(value)assertid(result)…

    2022年9月26日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号