开发者社区> 牧小农> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

JVM性能优化(三)G1垃圾收集器(1)

简介: JVM性能优化(三)G1垃圾收集器
+关注继续查看

一、简介


G1垃圾收集器是在jdk1.7中正式使用的全新的垃圾收集器,oracle官方计划在jdk9中将G1变成默认的垃圾收集器,以替代CMS


G1的设计 原则就是简化JVM性能调优,开发人员只需要简单的三步即可完成调优:


第一步:开启G1垃圾收集器

第二步:设置堆的最大内存

第三步:设置最大的停顿时间

G1中提供了三种模式垃圾回收模式,Young GC、Mixed GC 和 Full GC ,在不同的条件下被触发。


二、原理


G1垃圾收集器相比于其他收集器而言,最大的区别在于它取消了年轻代、老年代的物理划分,取而代之的是将堆划分为若干个区域(Region),这些区域中包含了有逻辑上的年轻代、老年代区域

这样做的好处就是,我们再也不用单独的空间对每个代进行设置了,不用担心每个代内存是否足够。


屏幕快照 2022-05-10 下午3.29.41.png

在G1划分区域中,年轻代垃圾收集器依然采用暂停所有应用线程的方式,将存活对象拷贝到老年代或者Survivor空间,G1收集器通过将对象从一个区域复制到另一个区域,完成了清理工作。


这就意味着,在正常的处理过程中,G1完成了堆的压缩(至少是部分堆的压缩),这样也就不会有CMS内存碎片问题的存在了,


在G1中,有一种特殊的区域,叫Humongous区域。


如果一个对象占用的空间超过了分区容量50%以上,G1收集器就认为这是一个巨型对象

这些巨型对象,默认直接会被分配在老年代,但是如果它是一个短期存在的巨型对象,就会对垃圾收集器造成负面影响。

为了解决这个问题,G1划分了一个Humongous区,它用来专门存放巨型对象,如果一个H区装不下一个巨型对象,那么G1会寻找连续的H分区存储,为了能找到连续的H区,有时候不得不启动 Full GC

三、Young GC


Young GC主要是对Eden区进行GC,它在Eden空间耗尽时会被触发。


Eden 空间的数据移动到Survivor 空间中,如果Survivor空间不够,Eden空间的部分数据会直接晋升到年老代空间

Survivor区的数据移动到新的Survivor区中,也有部分数据晋升到老年代空间中

最终Eden空间的数据为空,GC停止工作,应用线程继续执行


屏幕快照 2022-05-10 下午3.29.54.png

3.1、Remembered Set(已记忆集合)


在GC年轻代的对象时,我们如何找到年轻代中对象的根对象呢?

根对象可能是在年轻代中,也可以在老年代中,那么老年代的所有对象都是根吗?

如果全量扫描老年代,那么这样扫描下来会耗费大量的时间

于是,G1引进了Rset的概念,它的全称是 Remembered Set,其作用是跟踪执行某个堆内的对象引用

image.png

每个Region初始化时,会初始化一个remembered set(已记忆集合),这个翻译有点拗口,以下简称RSet,该集合用来记录并跟踪其它Region指向该Region中对象的引用,每个Region默认按照512Kb划分成多个Card,所以RSet需要记录的东西应该是 xx Region的 xx Card。


3.2、Mixed GC


当越来越多的对象晋升到老年代Old Region时,为了避免堆内存被耗尽,虚拟机会触发一个混合的垃圾收集器,既Mixed GC,该算法并不是一个Old GC,除了回收整个Young Region,还会回收一部分的Old Region,这里需要注意:是一部分老年代,而不是全部老年代,可以选择那些Old region 进行收集,从而可以对垃圾回收的耗时时间进行控制,也要注意的是Mixed GC并不是Full GC

Mixed GC什么时候出发?由参数 -XX:InitiatingHeapOccupancyPercent=n决定。默认:45%,该参数的意思是:当老年代大小占用整个堆大小百分比达到该阈值时触发。


它的GC步骤分两步:

1. 全局并发标记(global concurrent marking)

2. 拷贝存活对象(evacuation)


3.2.1 全局并发标记


全局并发标记,执行过程分为五个步骤:


**初始标记(initial mark ,STW):**标记从根节点直接可达的对象,这个阶段会执行一次年轻代GC,会产生全局停顿。


根区域扫描(root region scan):


G1 GC在初始标记的存活区扫描对老年代的引用,并标记被引用的对象

该阶段与应用程序(非STW)同时运行,并且只有完成该阶段后,才能开始下一次STW年轻代垃圾回收。

并发标记(Concurrent Marking): G1 GC在整个堆中查找可访问的(存活的)对象,该阶段与应用程序同时运行,可以被STW年轻代垃圾回收中断


重新标记(Remark,STW): 该阶段是STW回收,因为程序在运行,针对上一次的标记进行修改。


清楚垃圾(Cleanup,STW): 轻点和重置标记状态,该阶段会STW,这个阶段并不会实际上去做垃圾的收集,等待evacuation阶段来回收


3.2.2 拷贝存活对象


Evacuation 阶段是全暂停的,该阶段把一部分Region里的活对象拷贝到另一部分Region中,从而实现垃圾的回收清理。


四、G1 收集器相关参数


-XX:+UseG1GC: 使用G1垃圾收集器


-XX:MaxGCPauseMillis: 设置期望达到最大GC停顿时间指标(JVM会尽力实现,但不保证达到),默认值是200毫秒


-XX:G1HeapRegionSize=n:


设置的G1区域的大小,值是2的幂,范围是 1MB 到 32MB之间,目标是根据最小的Java堆大小划分出约2048个区域

默认 是堆内存的1/2000

-XX:ParallelGCThreads=n: 设置STW 工作线程数的值,将 n的值设置为逻辑处理器的数量,n的值与逻辑处理器的数量相同,最多为8


-XX:ConcGCThreads=n: 设置并行标记的线程数,将n设置为并行垃圾回收线程数(ParallelGCThreads)的1/4左右


**-XX:InitiatingHeapOccupancyPercent=n: **设置出发标记周期的java堆占用率阈值,默认占用率是这个Java堆的45%


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JVM性能优化(二)垃圾回收算法详解(1)
JVM性能优化(二)垃圾回收算法详解
13 0
GC垃圾收集器&JVM调优汇总(一)
最近朋友小B说想一份GC优化的资料内容,JVM内存分析以及性能调优的时候方便查询。可是文章太多根本看不过来,那么今天指北君就为大家带来这份,GC垃圾收集器总结及其优化指南,让你的JVM从此不再寂寞。
56 0
深入理解JVM(五)——HotSpot垃圾收集器详解
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/79612648 HotSpot虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,没有最好的垃圾收集器,只有最适合的垃圾收集器。
1023 0
深入理解JVM(三)——垃圾收集策略详解
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/79612610 Java虚拟机的内存模型分为五个部分,分别是:程序计数器、Java虚拟机栈、本地方法栈、堆、方法区。
1002 0
JVM垃圾收集(GC)
参考文献:周志明《深入理解Java虚拟机》第二版 因为 Java 具有自动垃圾回收机制,所以,垃圾收集(Garbage Collection,GC),是 Java 技术的核心之一,是...
1147 0
jvm系列(三):java GC算法 垃圾收集器
GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了。 jvm 中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入...
1286 0
+关注
牧小农
业精于勤荒于嬉,行成于思毁于随。
134
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载