关于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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue的安装和使用_vue-element

    vue的安装和使用_vue-element前言Vue(读音/vjuː/,类似于view)是一套用于构建前后端分离的框架。刚开始是由国内优秀选手尤雨溪开发出来的,目前是全球“最”流行的前端框架。使用vue开发网页很简单,并且技术生态环境完善

    2022年7月29日
    4
  • 电脑日语输入法打不了假名_华为输入法日语片假名

    电脑日语输入法打不了假名_华为输入法日语片假名换了个电脑装日语输入法,一直只能输英文字母打不了字,记录下解决方法。选语言首选项日本语->选项微软输入法->选项高级设置将下面的罗马字输入改为假名输入即可也可以选日英文混合,把下面都勾上,可以日文英文切换,比较方便。之后可以看到输入法旁边有个小假名,直接输入就可以了 こんにちは…

    2022年9月25日
    0
  • pycharm2019.3.3激活教程_pycharm2020.2激活码

    pycharm2019.3.3激活教程_pycharm2020.2激活码下载官网下载2019.03最新版http://www.jetbrains.com/pycharm/download/download-thanks.html?platform=windows安装一路点击下一步,安装目录建议放在非C盘位置激活方式1:激活码第一次打开时,激活方式选择激活码。复制粘贴下面一整行,点击激活即可。有效期是2019年11月份,到时候会更新新的激活码。这种方式…

    2022年8月25日
    3
  • 二进制与十进制,八进制,十六进制转换_十进制转十六进制算法

    二进制与十进制,八进制,十六进制转换_十进制转十六进制算法进制转换:二进制、八进制、十六进制、十进制之间的转换不同进制之间的转换在编程中经常会用到,尤其是C语言。将二进制、八进制、十六进制转换为十进制二进制、八进制和十六进制向十进制转换都非常容易,就是“按权相加”。所谓“权”,也即“位权”。假设当前数字是N进制,那么:对于整数部分,从右往左看,第i位的位权等于Ni-1对于小数部分,恰好相反,要从左往右看,第j位的位权为N-j。…

    2022年10月18日
    0
  • 使用.NET统计文件夹中文件总数

    软件下载:http://hovertree.com/h/bjaf/hwqtjwjs.htm截图:使用方法:点击按钮,选择文件夹,就可以显示文件夹中包含的文件总数。这个项目包含在HoverTree解

    2021年12月22日
    55
  • ElasticSearch join连接查询「建议收藏」

    ElasticSearch join连接查询「建议收藏」ElasticSearchjoin连接查询特别说明:文章所有内容基于ElasticSerch5.5.3版本ElasticSerch的连接查询有两种方式实现nestedparent和child关联查询nested存储结构nested的方式和其他字段一样,在同一个type里面存储,以数组的方式存储在type里,格式如下:PUTindex…

    2022年6月16日
    76

发表回复

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

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