java g1 gc ref proc_深入理解垃圾收集器的G1及日志分析

尽管Hotspot 最新的垃圾回收器G1是在2006年推出的。但是G1从推行至今的市场反响来看,但现在足以证明这款垃圾收集器是经得起考验的,从java9开始,就默认为G1垃圾收集器。G1是一款面向服务端应用的垃圾收集器。HotSpot开发团队赋予它的使命是(在比较长期的)未来可以替换掉JDK1.5中发布的CMS收集器。与其他GC收集器相比,G1具备如下特点。

并行与并发、分代收集的垃圾收集算法、可预测的停顿、空间整合。

特点

从分代来看,G1依然属于分代垃圾收集器,她会区分年轻代和老年代,依然有eden区和survivor区,但从堆的结构来看,它并不要求整个eden、年轻代或者老年代都连续,它使用了分区算法。

并行性: 在回收期间,可以由多个GC线程同时工作,有效利用多核计算能力。

井发性: GI 拥有与应用程序交替执行的能力,部分工作可以和应用程序同时执行,因此一 般来说,不会在整个回收期间完全阻塞应用程序。

分代 GC : Gl 依然是一个分代收集器,但是和之前回收器不同,它同时兼顾年轻代和老年代。对比其他回收器,它们或者工作在年轻代,或者工作在老年代。因此,这里是一个很大的不同。

空间整理: Gl 在回收过程中,会进行适当的对象移动,不像CMS,只是简单地标记清理对象,在若干次 GC 后,CMS 必须进行一次碎片整理。而Gl不同,它每次回收都会有效地复制对象,减少空间碎片。

G1把内存“化整为零”的思路,理解起来似乎很容易,但其中的实现细节却远远没有想象中那样简单,否则也不会从2004年Sun实验室发表第一篇G1的论文开始直到今天(将近10年时间)才开发出G1的商用版。

笔者以一个细节为例:把Java堆分为多个Region后,垃圾收集是否就真的能以Region为单位进行了?听起来顺理成章,再仔细想想就很容易发现问题所在:Region不可能是孤立的。一个对象分配在某个Region中,它并非只能被本Region中的其他对象引用,而是可以与整个Java堆任意的对象发生引用关系。那在做可达性判定确定对象是否存活的时候,岂不是还得扫描整个Java堆才能保证准确性?这个问题其实并非在G1中才有,只是在G1中更加突出而已。在以前的分代收集中,新生代的规模一般都比老年代要小许多,新生代的收集也比老年代要频繁许多,那回收新生代中的对象时也面临相同的问题,如果回收新生代时也不得不同时扫描老年代的话,那么Minor GC的效率可能下降不少。

​在G1收集器中,Region之间的对象引用以及其他收集器中的新生代与老年代之间的对象引用,虚拟机都是使用Remembered Set来避免全堆扫描的。G1中每个Region都有一个与之对应的Remembered Set,虚拟机发现程序在对Reference类型的数据进行写操作时,会产生一个Write Barrier暂时中断写操作,检查Reference引用的对象是否处于不同的Region之中(在分代的例子中就是检查是否老年代中的对象引用了新生代中的对象),如果是,便通过CardTable把相关引用信息记录到被引用对象所属的Region的RememberedSet之中。当进行内存回收时,在GC根节点的枚举范围中加入Remembered Set即可保证不对全堆扫描也不会有遗漏。

G1的内存划分和主要收集过程

G1收集器讲堆进行分区,划分为一个个区域,每次收集时,只收集其中几个区域,以此来控制垃圾回收产生的一次停顿时间。

G1收集过程四个阶段:

新生代GC(YGC)

并发标记周期

混合收集

如果需要进行full GC

G1的新生代GC

新生代GC的主要工作是回收eden区和survivor区。 一旦eden 区被占满,新生代GC就会启动。新生代GC收集前后的堆数据如图5.6所示,其中E表示eden区,S表示survivor区, o表示老年代。可以看到,新生代GC只处理eden和survivor区,回收后,所有的eden区都应该被消空,而survivor区会被收集一 部分数据,但是应该至少仍然存在一 个 survivor 区,类比其他的新生代收集器,这一 点似乎并没有太大变化。另一 个亟要的变化是老年代的区域增多,因为部分survivor区或者eden区的对象可能会晋升到老年代。

f6be2cfc74e940932c8f492a257a9660.png

c38ade774b58619a366cb335edf4d15c.png

从日志中可以看到,eden区原本占用235MB空间,回收后被清空,survivor区从5MB增长到了11MB, 这是因为部分对象从eden区复制到survivor区,整个堆合计为400MB, 从回收前的239MB下降到10.5MB。

G1的井发标记周期

G1的并发阶段与CMS有点类似,他们都是为了降低一次停顿时间,而将可以和应用程序并发的部分单独提取出来执行。

并发标记周期可以分为以下几步。如果不计算维护RememberedSet的操作,G1收集器的运作大致可划分为以下几个步骤:

初始标记(Initial Marking)

根区域扫描

并发标记(Concurrent Marking)

最终标记(Final Marking)

独占清理

筛选回收(Live Data Counting and Evacuation)

复制代码

初始标记: 标记从根节点直接可达的对象。这个阶段会伴随一次新生代GC,它会产生全局停顿。

根区域扫描: 由于初始标记必然会伴随一次新生代的GC,所以在初始化标记后,eden被清空,并且存活对象被移入survivor区。这个阶段,将扫面survivor区直接可达的老年代对象,并标记这些直接可达的对象。根区域扫描不能和新生代GC同时执行。

并发标记: 和CMS类似,扫面查找整个对存活的对象,这是一个并发的过程,可以被一次新生代GC打断。

重新标记: 由于并发标记过程中,应用仍在执行,因此标记结果需要修正,所以对上一次的标记结果进行补充,在G1中,这个过程使用STAB算法完成。即G1会在标记之初为存活对象创建一个快照,有助于加速重新标记速度。

独占清理: 这个阶段会引起停顿。

并发清理阶段: 识别并清理完全空闲的区域。它是并发的清理,不会引起停顿。

3505cc04e4ec74e9bcc2fb43ff3bcd3e.png

9e73e8c90fff874ffd1a07961cccb453.png

在并发标记周期时,G1会产生如下日志:

(1)、初始标记,伴随一次新生代GC

[GC pause (G1 Humongous Allocation) (young) (initial-mark), 0.0117414 secs]

...

[Eden: 1024.0K(4096.0K)->0.0B(2048.0K) Survivors: 2048.0K->1024.0K Heap: 9581.8K(20.0M)->12.3M(20.0M)]

[Times: user=0.11 sys=0.00, real=0.01 secs]

复制代码

可以看到初始化标记时,eden被清空,并部分复制到survivor区

(2)、这是一次并发的根区域扫描,并发扫面过程中,不能被新生代GC打断。

[GC concurrent-root-region-scan-start]

[GC concurrent-root-region-scan-end, 0.0007368 secs]

复制代码

(3)、下面这个是指并发标记

[GC concurrent-mark-start]

[GC pause (G1 Evacuation Pause) (young) (to-space exhausted), 0.0427113 secs]

.....

[Eden: 2048.0K(2048.0K)->0.0B(1024.0K) Survivors: 1024.0K->1024.0K Heap: 16.4M(20.0M)->18.0M(20.0M)]

[Times: user=0.05 sys=0.02, real=0.04 secs]

...

[GC concurrent-mark-abort]

复制代码

(4)、重新标记引起全局停顿

[Ref Proc: 0.3 ms]

复制代码

(5)、重新标记后进行独占清理

4.088: [GC cleanup 117M->106M(138M), 0.0015198 secs]

复制代码

(6)、并发清理是并发执行的,会根据独占清理阶段计算出的每个区域的存活对象数量,直接回收已经不包含存活对象的区域。

4.090: [GC concurrent-cleanup-start]

并发清理阶段开始,它释放被发现为空的区域(不包含任何的活跃数据的区域),在上一个stop-the-world阶段期间。

4.091: [GC concurrent-cleanup-end, 0.0002721]

并发清理阶段清理空的区域用时0.0002721秒。

复制代码

关于G1日志,想要知道所有内容的,可以看这篇文章,适合查询:

blog.csdn.net/zhanggang80…

混合回收

在并发标记周期中,虽然有部分对象被回收,但是从整体上来说,回收的比例是相当低的。但是在并发标记周期后,G1已经明确知道哪些区域含有比较多的垃圾对象了,在混合阶段,就是对这些区域进行回收的。当然,会优先回收垃圾比例比较高的区域。因为回收这些区域的性价比比较高。

G1是指垃圾优先的垃圾回收器,全称"Garbage First Garbage Collector".

在混合回收中,即会执行正常年轻代GC,也会选取被标记的老年代区域进行回收,它同时处理了新生代和老年代。因为新生代GC的原因,eden区域必然被清空,此外,如下图,有两块区域被标记为G的垃圾回收比例最高的区域被清理。被清理区域的存活对象会被移动到其他区域,这样的好处是可以减少空间碎片。f732e57dfe70393ad4b9c2ac8d3ed81c.png

混合GC产生如下日志:7c4dce1ba788f5250c9a56a65325d9dc.png

混合GC执行多次,直到回收了足够多的内存空间,触发一次新生代GC。新生代GC后,有可能会发生一次并发标记周期的清理,最后又引起混合GC。整个流程见下图:

3b29968bd593a147fe93044001c6dd78.png

必要时的Full GC

与CMS类似,并发收集由于让应用和GC线程交替工作,因此总是不能避免在特别的繁忙场合在回收过程导致内存不足,此时,G1也会执行一个Full GC回收。

d53e9ab6ab47a4a53896c2f925abd699.png

此外,在混合GC和新生代GC时,survivor与老年代无法无法容纳幸存对象,都会导致Full GC产生

完整的G1日志分析

56e4a6dea280d4859579f20c0c576af8.png

4d3ad712ec3e761ffd70577a9dc3a723.png

44b1c8a589b1f898aff1460c0cc11333.png

ccc94adb40f5d9382a37bfe73dcc8d4c.png

3c27db9a59cb1771998bbc2ecae5b2e5.png

ec673f2ba55eeb86687a7e5573252200.png

G1 的相关参数

对于Gl收集器,可以使用-XX:+UseGIGC标记打开Gl收集器开关,对Gt收集器进行设置时,最重要的一 个参数就是-XX :MaxGCPauseMillis,它用于指定目标最大停顿时间。如果任何一次停顿超过这个设置值时,Gl就会尝试调整新生代和老年代的比例、调整堆大小、调整晋升年龄等手段,试图达到预设目标。对于性能调优来说,

有时候,总是鱼和熊掌不可兼得的,如果停顿时间缩短,对千新生代来说,这意味着很可能要增加新生代GC的次数,GC反而会变得更加频繁。对于老年代区域来说,为了获得更短的停顿时间,那么在混合GC收集时,一次收集的区域数量也会变少,这样无疑增加了进行FullGC的可能性。另外一个重要的参数是-XX :ParallelGCThreads, 它用于设置并行回收时,GC的工作线程数量。

此外,-XX:InitiatingHeapOccupancyPercent参数可以指定当整个堆使用率达到多少时,触发并发标记周期的执行。默认值是45, 即当整个堆占用率达到45%时,执行并发标记周期。 InitiatingHeapOccupancyPercent 一 旦设置,始终都不会被G l收集器修改,这意味着G I收集器不会试图改变这个值,来满足MaxGCPause汕His的目标。如果InitiatingHeapOccupancyPercent值设置偏大,会导致并发周期迟迟得不到启动,那么引起Full GC的可能性也大大增加,反之,一 个过小的 InitiatingHeapOccupancyPercent值,会使得并发周期非常频繁,大整 GC 线程抢占CPU, 会导致应用程序的性能有所下降。

来自《深入理解JVM虚拟机》JVM高级特性与最佳实现。

《实战java虚拟机》复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gif透明背景动画_【超实用干货! 】iPad上的动画App大推荐

作者/立夏编辑/彼方大家好,我是立夏。大概在两年前吧我为大家写过几款动画APP的评测,这一次我也想给大家推荐一些我的新宠,供大家参考。我在这里就不过多提及如Animation Desk、Procreate或是Callipeg之类知名度相对更高一些的动画App了&…

iphone如何信任软件_【手机软件】千禾影院:全新观影神器,支持安卓+iOS,最新、最全、高清、免费!...

Hello,大家好,我是春哥!每天记得打卡哦!感谢每一位小伙伴们的关注和支持!免责声明大部分资源来源于网络,仅供学习和交流使用,如有侵权请联系我们删除。每期文章末尾都会有关键词,在公众号发消息…

Java小魔女芭芭拉_沉迷蘑菇不可自拔,黏土人《小魔女学园》苏西·曼芭芭拉 图赏...

GOOD SMILE出品的黏土人系列手办新作——《小魔女学园》苏西曼芭芭拉,已经开始接受预定了。这款黏土人的原型师是来自中国上海的陈天,售价4167日元,预计2018年4月发售。苏西是主人公亚可的室友,她是从东南亚来的身份不明的魔女。热…

java int相除向上取整_java实战项目常用类,Date、Calendar、BigDecimal、Math、UUID

Java开发中经常用到的类和方法,以下主要就日期是时间处理、金融数字处理、数学计算、随机数、MD5加密等。java.util.Date类java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。日期时间的本质是一个long,它…

R语言中dim函数_R语言--向量化计算(apply族函数)

R语言最优秀的是它的向量化编程,这其中apply族函数扮演了非常重要的角色。apply族函数是由apply、sapply、lapply、mapply、tapply等函数组成的。熟练使用apply族函数,能够简化程序,提高代码的运算速度。软件&环境win10 64bitR 3.6.1appl…

谷歌浏览器中文版_中国科学家设计超薄指尖传感器,厚度不到A4纸五分之一 / 谷歌发布地图时光机:百年前,你家街道啥样?/ AI看图说话首超人类...

关注我们了解计算机视觉最新动态 !动态先览1中国科学家设计超薄指尖传感器,厚度不到A4纸五分之一2谷歌发布地图「时光机」:100年前,你家街道长啥样?3仿真环境跟车2分钟,就让自动驾驶系统撞上马路牙子&#…

300小时成为java程序员_直击面试现场: Java程序员3轮6小时面试, 成功拿到阿里offer!...

原标题:直击面试现场: Java程序员3轮6小时面试, 成功拿到阿里offer!今天给大家分享一位Java程序员小伙去阿里应聘的经历!从Java开发要掌握的技术来讲,前面已经说得差不多了。我主要想从面试者的角度谈一谈看法。如果是我面试,就给…

anaconda python3.8目录_MacBook Pro 安装anaconda、配置环境

新入手了MacBook Pro,iOS系统还不算非常熟练...作为一个新手程序员,在python开发道路上的学习就从安装环境开始吧:1、下载安装包2、安装过程一路同意or继续...不过,mac上弹出不允许在当前路径安装,那么选择自定义安装路…

stm32外部中断_STM32学习笔记 | 电源管理及低功耗设计要点

一款好的电子产品,都需要认真考虑电源管理的问题,电池供电的产品更应该注意低功耗的实现。 STM32电源介绍嵌入式开发直播课 - STM32 USART串口的应用 - 创客学院直播室​www.makeru.com.cn每一块STM32芯片中都有一个电源控制器(PWR&#xff0…

delphi 调用浏览器内核_HFL:基于混合模糊测试的Linux内核漏洞挖掘

RemarksConference: NDSS 2020Full Paper: HFL: Hybrid Fuzzing on the Linux KernelSummary针对的问题: Linux 操作系统内核安全漏洞的发现需要新技术。现有解决方案的不足:当前的模糊测试技术难以直接应用于内核安全漏洞发现。提出的创新方案概述&…

隔行变色java代码_jquery入门—选择器实现隔行变色实例代码

1、JQuery选择器继承了CSS、path语音的部分语法,允许通过标签名、属性名、内容对DOM元素进行快速、准确的选择。2、JQuery选择器与JavaScript相比,具有代码简单、完善的检测机制的优势。3、使用JQuery选择器实现隔行变色,示例代码如下&#x…

角标越界 Java_【新人求助】利用占位符操作数据库是总是提示数组角标越界是怎么回事 - Java论坛 - 51CTO技术论坛_中国领先的IT技术社区...

用占位符和数组来操作数据库总是提示下角标越界,找了半天也没弄明白哪里有问题,这个地方是跟着云课堂老师的讲解做的,只不过操作的数据表不一样,但是老师那个就没问题,我就出了问题,如果有大神能帮忙看看&a…

简述ospf的工作原理_现代数字存储示波器的工作原理简述

示波器是一种用途十分广泛的电子测量仪器。俗话说,电是看不见摸不着的。但是示波器可以帮我们“看见”电信号,便于人们研究各种电现象的变化过程。所以示波器的核心功能,就和他的名字一样,是显示电信号波形的仪器,以供…

pyecharts 间距_高月双色球20108期:红球首尾间距参考29区段

双色球第2020108期奖号为:03 09 11 24 25 28 16,红球和值:100,重号2个:11 28,首尾间距:25。和值:上期和值为100,上升了22点,再次开出小和值,最近…

java类中声明log对象_用于Android环境,java环境的log打印,可打印任何类型数据

LogXixi用于Android环境,java环境的log打印,可打印任何类型数据,根据android项目环境debug环境自动打开,release环境自动关闭android环境log打印,规范bean对象,json,xml对应log,crash捕捉&#…

xbox手柄接收器驱动_xbox手柄连接 win10电脑

xbox手柄 连接win10笔记本 分为三种连接方式:有线蓝牙无线适配器首先说明一下连接方式的特点然后说明连接方式第一种:有线连接 手柄直接通过micro USB数据线和win10电脑连接。这一步最简单,一般电脑会自动安装驱动,连接之后可以使…

单片机复位后为什么要对sp重新赋值_51单片机系列之2点亮第一个led小灯

点亮led灯简单的理解就是要求阳极高电平阴极低电平。接下来我们去看看单片机的原理图,找到led 模块。如图可以看到led的阳极是连接的VCC(电源高电平)阴极连接的接口是单片机的I/O口P20到P27.要想led点亮只需控制单片机I/O口输出低电平即可(单片机I/O口默认高电平)。…

关机时无人照管更新正在运行_无法抗拒的未来:无人叉车在内部物流中已成为现实...

自动化和半自动化的叉车不再是新奇的东西,在人力短缺的仓库中取得了进展。他们最终会成为规范吗?目前尚不知道全世界有多少辆无人驾驶叉车(也称为自动叉车、机器人叉车或者AGV)售出。但是叉车生产商都显示出,它在该领域的迅速增长。重要的是&#xff0c…

打开浏览器不是主页_对于360浏览器的一些小小改善

​虽然自己不怎么喜欢,但是以前小编的多数同事都在使用它,所以今天带来360安全浏览器改造的小建议。整理&排版 | idea君 ,预计阅读 | 4分钟文章意在学习交流分享,如有侵权请联系删除封面:http://www.pexels.com/zh…

c++ 二次开发 良田高拍仪_六枝特良田LYV-850加工中心导轨配套防护罩日常维修

六枝特良田LYV-850加工中心导轨配套防护罩日常维修我厂生产的防护罩质量可与原厂的一样,同样的保障,质保期为一年,护罩安装不合适支持退换货。尤其是元件连结的接合面刚度,对加工精度影响较大。通常,采用组合夹具时其尺…