关于G1收集器

关于G1收集器G1(GarbageFirst)收集器是Oracle公司开发的一款主要面向服务端的拥有相对可靠的停顿预测模型的垃圾收集器。在垃圾收集器的历史上有着里程碑式的意义。与之前的收集器不同,G1不在基于固定的新生代与老年代的内存分配方式进行垃圾清理,而是使用了基于Region的内存分配的方式进行垃圾清理。这种方式使得G1在进行垃圾清理的时候不需要对整个新生代或老年代甚至整个Java堆进行垃圾清理,这样就极大的减少标记期间的停顿时间。设计思路:面向局部(单个或多个Region)收集内存布局:基于Regi

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

G1(Garbage First)收集器是Oracle公司开发的一款主要面向服务端的拥有可靠的停顿预测模型的垃圾收集器。在垃圾收集器的历史上有着里程碑式的意义。在jdk9以后被设置为服务器端默认的垃圾收集器。

与之前的收集器不同,G1不在基于固定的新生代与老年代的内存分配方式,而是使用了基于Region的内存分配的方式。这种方式使得G1在进行垃圾清理的时候不需要对整个新生代或老年代甚至整个Java堆进行垃圾清理,这样就明显减少了标记期间所需时间。

设计思路

面向局部(Region)收集

内存布局

基于Region的内存布局形式

Region(域)

G1会将Java堆分为多个大小相等的区域,每个区域都是一个Region,收集器在处理垃圾的时候都是以Region为单位进行的。同时为更好分配大对象,G1还设计了一种Humongous的特殊Region,对象大小(一般是单个Region的一半大小)在到达一定阈值会被分配到这里,对于一些更大的对象(超过单个Region容量)则会被分配在连续的Humongous中。

对象间的跨Region引用

通过记忆集实现来处理。G1收集器会为每个Region都维护一个记忆集,这些记忆集在存储结构本质是一种哈希表,在这些中哈希表会存有每个Region的起始地址和对应的卡表索引号,然而由于Region的数量比较多而且要给每个Region都要维护一个记忆集,所以G1收集器在工作的时候会占用Java堆比较多的资源,大概在10-20%左右。

并发标记

实现并发标记的方式主要有两种:1.增量更新;2.原始快照。

G1收集器使用的是原始快照的方式。由于此时用户线程仍在进行,所以很大概率还会有新的对象被创建,为了方便维护,G1为每个Region设置了TAMS(Top at Mark Start)指针并且拿出该Region一部分空间存放新对象,在并发标记期间创建的对象都会被分配在这里,并且这些对象都会被隐式标记使其在本次垃圾回收中不会被回收。此外,如果内存回收的速度比不上内存分配的速度,G1收集器会强制冻结用户线程进行一次Full GC,这样的话用户线程就会因此停顿较长的时间。

可靠的停顿预测模型

停顿预测模型是基于衰减均值的理论基础建立的,强调衰减是因为对于新信息更加敏感,可以更好的反应最近的平均状态,统计状态越新越能体现出Region的回收价值,可以根据这些信息去预测下次垃圾回收。

停顿预测模型的意思是能够支持指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集的时间大概率不超过N毫秒这样的目标。                《深入理解Java虚拟机》

在进行垃圾回收的时候G1收集器会对每个Region的情况进行统计,并据此计算出哪些Region的回收收益更高,并将这些高回报率的Region组成一个回收集对其进行垃圾回收。

垃圾回收

G1收集器进行垃圾收集的过程可以分为以下4个过程:

1、初始标记

        遍历并标记那些与GCRoots直接关联的对象并修改TAMS指针的值,在这个过程中用户线程会有短暂停顿

2、并发标记

        从GCRoots开始对Java堆的对象进行可达性分析,找到并标记那些需要回收的对象,该过程耗时较长但可以与用户线程并发执行。在标记完成后,还会有一次操作,就是对并发过程中引用发生过变化的对象重新扫描标记一次。

3、最终标记

        处理那些在并发标记阶段结束后仍然残留的引用有变更的对象记录。该过程中用户线程会短暂停顿。

4、筛选回收

        对各个Region进行统计,计算出哪些Region可以进行回收、可以组成回收集来获得较高的收益,并将此次的统计信息记录下来,便于下次垃圾回收时可以根据这些信息预测那些Region的回收收益。该过程用户线程会被暂停。

关于G1

对于G1来说,基于Region的内存布局和可靠的停顿预测模型使得G1在众多收集器中脱颖而出。基于Region的内存布局方式使得G1在垃圾回收时更加高效率,而可靠的停顿预测模型使得G1可以把停顿时间控制在用户的期望时间内,当然这个时间不能太短,否则每次只能收集到很少的垃圾,导致垃圾回收速度跟不上对象分配的速度而出现Full GC,最终反而会降低程序执行的效率,降低系统的吞吐量。同时G1在内存、cpu等资源占用上也比较高,这也算是G1的不足之处了。

关于收集器的选择,并没有完美的虚拟机,再好的虚拟机也总有几处做的不是很好的地方。要想在某些方面突出,就要接受另外一些方面的不足,要么采用折中的思想,即没有某些比较突出特点但也没有比较差劲的方面。

所以要选择合适的收集器,更重要的是要看用途、服务领域、面向人群,因地制宜,而且还有一些具体的虚拟机的参数可以供人去优化调控。

第一次写,感觉逻辑有些混乱,想到啥写啥。。。

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

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

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


相关推荐

  • 正则表达式替换自身「建议收藏」

    正则表达式替换自身「建议收藏」一、问题:将文本中所有[XXX]替换成XXX(XXX包含字母数字下划线),就是将中括号去掉了例如:[PK_Roles]   替换成:PK_Roles二、解答:正则式:\[([0-9a-zA-Z_]*)\]加圆括号表示分组并作为“反向索引”,[0-9a-zA-Z_]*表示多个数字字母下划线替换式:\1\1表示引用第1个组,\1在有些环境中是$1三、常用正则表达式空行

    2022年5月16日
    41
  • 蓝桥杯 错误票据 原创代码+思路

    蓝桥杯 错误票据 原创代码+思路

    2021年8月28日
    54
  • django配置文件详解_django实时读取日志

    django配置文件详解_django实时读取日志前言django框架的日志通过python内置的logging模块实现的,既可以记录自定义的一些信息描述,也可以记录系统运行中的一些对象数据,还可以记录包括堆栈跟踪、错误代码之类的详细信息。log

    2022年7月31日
    10
  • 测试开发工程师常见面试题[通俗易懂]

    测试开发工程师常见面试题[通俗易懂]1.CPU和GPU的区别CPU力气大啥P事都能干,还要协调。GPU上面那家伙的小弟,老大让他处理图形,这方面处理简单,但是量大,老大虽然能处理,可是老大只有那么几个兄弟,所以不如交给小弟处理了,小弟兄弟多,有数百至数千个,而且是专门只干这行和只能干这行。详细解释2.推荐的算法有哪些?1基于人口统计学的推荐2基于内容的推荐3协同过滤4混合推荐算法3….

    2022年5月16日
    72
  • javascript中的字符串编码转换

    javascript中的字符串编码转换起因 自定义的一个 spider 在抓取来的数据中 有各式各样的数据存储编码 有些编码是 uxxxx uxxxx 的方式 这就涉及到一个 unicode 到可见字符的转换 比如转换为 gb2312 这样才能方便我们离开浏览器后也能阅读 原文链接 http ddbiz com p 194 在网上找了很多次方面的编码转换对照表 不过几乎没有一个完整 所以自己整理了一份 希望对大家有帮助 它

    2025年7月3日
    3
  • 系统扩展方式 scale up和scale out

    系统扩展方式 scale up和scale out什么是 scaleup 和 scaleout 许多存储系统开始很简单 但当需要进行系统扩展时就会变得复杂 升级存储系统最常见的原因是需要更多的容量 以支持更多的用户 文件 应用程序或连接的服务器 但是通常 存储系统的升级不只是需要容量 系统还对其他存储资源有额外需求 即带宽和计算能力 如果没有足够的 I O 带宽 将出现用户或服务器的访问瓶颈 没有足够的计算能力 常用的存储软件如快照 复

    2025年7月30日
    5

发表回复

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

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