23-一文带你搞懂G1收集器

2021新Java后端开发工程师学习路线,千万别错过 计算机基础 在我们学习编程中,常常认为实践是重要的,而计算机相关的一些基础知识很容易被我们忽视。 如果在实际的开发中对基础知识没有很好的掌握,很容易走很多弯路,遇到问题可能无法定位。 在应用框架的学习时如果感觉吃力,可能非常有必要回过头来再巩固对应的基础知识。 所以学习好相关电商运营理论知识,是成为一个合格后端开发工程师的基石。 如果时间充足,对于基础知识可以看一些教材书籍。 如果想快速了解相关知识,可以在开源社区寻找一些大佬的项目进行充电。推荐以下项目: https://githu... 阅读详情

G1收集器介绍

Garbage First(简称G1) 收集器是垃圾收集器技术发展历史上的里程碑式的成果, 它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。早在JDK 7刚刚确立项目目标、 Oracle公司制定的JDK 7 RoadMap里面, G1收集器就被视作JDK 7中HotSpot虚拟机的一项重要进化特征。

G1是一款主要面向服务端应用的垃圾收集器。HotSpot开发团队最初赋予它的期望是(在比较长期的) 未来可以替换掉JDK 5中发布的CMS收集器。现在这个期望目标已经实现过半了, JDK 9发布之日, G1宣告取代Parallel Scavenge加Parallel Old组合, 成为服务端模式下的默认垃圾收集器, 而CMS则沦落至被声明为不推荐使用(Deprecate) 的收集器 。

首先要有一个思想上的改变, 在G1收集器出现之前的所有其他收集器, 包括CMS在内, 垃圾收集的目标范围要么是整个新生代(Minor GC) , 要么就是整个老年代(Major GC) , 再要么就是整个Java堆(Full GC) 。而G1跳出了这个樊笼, 它可以面向堆内存任何部分来组成回收集(Collection Set, 一般简称CSet) 进行回收, 衡量标准不再是它属于哪个分代, 而是哪块内存中存放的垃圾数量最多, 回收收益最大, 这就是G1收集器的Mixed GC模式。

G1开创的基于Region的堆内存布局是它能够实现这个目标的关键。虽然G1也仍是遵循分代收集理论设计的, 但其堆内存的布局与其他收集器有非常明显的差异:G1不再坚持固定大小以及固定数量的分代区域划分, 而是把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要, 扮演新生代的Eden空间、 Survivor空间, 或者老年代空间。收集器能够对扮演不同角色的Region采用不同的策略去处理, 这样无论是新创建的对象还是已经存活了一段时间、 熬过多次收集的旧对象都能获取很好的收集效果。

Region中还有一类特殊的Humongous区域, 专门用来存储大对象。G1认为只要大小超过了一个Region容量一半的对象即可判定为大对象。每个Region的大小可以通过参数-XX:G1HeapRegionSize设定, 取值范围为1MB~32MB, 且应为2的N次幂。而对于那些超过了整个Region容量的超级大对象,将会被存放在N个连续的Humongous Region之中, G1的大多数行为都把Humongous Region作为老年代的一部分来进行看待, 如下图所示:

虽然G1仍然保留新生代和老年代的概念, 但新生代和老年代不再是固定的了, 它们都是一系列区域(不需要连续) 的动态集合。G1收集器之所以能建立可预测的停顿时间模型, 是因为它将Region作为单次回收的最小单元, 即每次收集到的内存空间都是Region大小的整数倍, 这样可以有计划地避免在整个Java堆中进行全区域的垃圾收集。

G1收集器能建立可预测的停顿时间模型 这句话什么意思?

比如我们希望G1在垃圾回收的时候可以保证1小时内系统停顿(STW)的时间不超过1分钟。

那这个模型就很厉害了!之前我们通过各种JVM参数设置,内存分配就是为了尽可能的减少Minor GC和Full GC带来的停顿,从而影响系统的请求。 而现在通过G1收集器能直接给定一个指定的时间,交给G1全权负责,达成目标!

那么G1是如何做到对垃圾回收导致的系统停顿可控的?

G1收集器之所以能建立可预测的停顿时间模型, 是因为它将Region作为单次回收的最小单元, 即每次收集到的内存空间都是Region大小的整数倍, 这样可以有计划地避免在整个Java堆中进行全区域的垃圾收集。

那么具体的思路是:G1会对每一个Region里回收价值进行追踪,动态的判断如何回收

啥叫回收价值呢?也就是G1必须搞清楚每一个Region里面到底有多少的垃圾对象需要回收,以及回收这些对象需要消耗多少时间。

比如下图,1个Region中有10MB,需要回收时间为1S,另一个Region中有20MB垃圾对象,需要消耗200ms,那么G1肯定会优先选择时间更少还能回收更多垃圾的200msRegion。

G1收集器去跟踪各个Region里面的垃圾堆积的“价值”大小, 价值即回收所获得的空间大小以及回收所需时间的经验值, 然后在后台维护一个优先级列表, 每次根据用户设定允许的收集停顿时间(使用参数-XX:MaxGCPauseMillis指定, 默认值是200毫秒) , 优先处理回收价值收益最大的那些Region, 这也就是“Garbage First”名字的由来。这种使用Region划分内存空间, 以及具有优先级的区域回收方式, 保证了G1收集器在有限的时间内获取尽可能高的收集效率。 这也是G1的核心设计思路。

相关JVM参数:

-XX:+UserG1GC :在JDK8中可以通过手动指定使用G1收集器进行回收

-XX:G1HeapRegionSize=size 指定每一个Region的大小

-XX:MaxGCPauseMillis=time 指定收集的停顿时间,默认是200ms

G1中的Region是如何分配的?每个Region大小是多少?

默认情况下是自己分配和设置,我们依然可以通过参数:“-Xms”和“-Xmx”来设置堆内存的大小,默认情况下是分配2048个Region,比如我们设置堆内存大小为2G,那么分配到2048个Region中,每一个Region的大小就是1MB。而且Region的大小必须是2的倍数,比如1MB,2MB,4MB之类的。

当然我们也可以通过“-XX:G1HeapRegionSize”来手动指定每一个Region的大小。

这里还有一些默认配置需要大家清楚:

  • 新生代默认开始分配占比是5%,可以通过“-XX:G1NewSizePercent“来设置新生代初始占比
  • 新生代运行过程中最多可以分配到60%的堆内存,可以通过“-XX:G1MaxNewSizePercent”来设置
  • 新生代中默认也是按照8:1:1对Eden和survivor去进行分配

下一篇将继续深入分析G1收集器的垃圾回收流程。

在这里插入图片描述

Ubuntu 16.04 下用 apt-get 安装 OpenJDK 8 的完整实践指南 Java 运行时环境(JRE)和 Java 开发工具包(JDK)是 Linux 服务端应用的基础依赖;其安装原理涉及包管理、依赖解析与系统级集成。apt-get 作为 Debian/Ubuntu 系统原生包管理器,通过 APT 仓库提供版本锁定、依赖自动校验与安全更新推送能力,显著优于手动解压或第三方工具部署。OpenJDK 8 因长期支持、JVM 稳定性及与 Tomcat 8.5 等老版本中间件的深度兼容,成为 Ubuntu 16.04 等 ESM 阶段系统的首选 JDK。启用 Extended Secu 阅读详情

相关推荐

Linux日志体系全解析:Ubuntu/Debian/CentOS日志架构与实战排查

Linux日志是操作系统运行状态的核心反馈机制,其本质是一套分层采集、结构化存储、分级过滤的可观测性基础设施。基于systemd-journald、rsyslog和logrotate构成的日志流水线,在Ubuntu、Debian和CentOS三大发行版中呈现显著差异:journald默认持久化策略、rsyslog输入模块选型(imjournal vs imuxsock)、关键路径映射(如auth.log vs secure)及日志级别语义(priority=3对应err级故障信号)共同决定了排查效率。掌握这

weixin_33851429的博客 323

JVM内存模型和性能调优:垃圾收集算法:垃圾收集器(三) - 第33篇

五、G1收集器(-XX:+UseG1GC) 5.1 概念 G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多核处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征(面对大容量内存的机器)。 G1将Java堆划分为多个大小相等的独立区域(Region),JVM多可以有2048个Region。 ...

悟纤学院 2万+

垃圾回收之G1收集过程

G1 中提供了 Young GC、Mixed GC 两种垃圾回收模式,这两种垃圾回收模式,都是 Stop The World(STW) 的。G1 没有 fullGC 概念,需要 fullGC 时,调用 serialOldGC 进行全堆扫描(包括 eden、survivor、o、perm)。

互联网架构师笔记 2665

JVM中G1垃圾收集器:原理、过程和参数配置深入解析

G1收集器(Garbage-First Garbage Collector,简称G1 GC)是Java虚拟机(JVM)中的一种垃圾收集器,专为服务器端应用设计,特别适用于具有多核处理器和大内存的机器。G1 GC在JDK 7u4版本中被正式推出,并且在JDK 9中成为默认的垃圾收集器。它的主要目标是在满足高吞吐量的同时,尽可能缩短垃圾收集造成的停顿时间。G1垃圾收集器以其可预测的停顿时间、灵活的内存管理和高效的并发标记等特点,在JVM中占据了重要的地位。

码到三十五 3万+

JVM垃圾回收——G1垃圾收集器

Garbage First(简称G1)收集器垃圾收集器技术发展史上里程碑式的成果,它摒弃了传统垃圾收集器的严格的内存划分,而是采用局部回收的设计思路和基于Region的内存布局形式。G1是一款主要面向服务端应用的垃圾收集器,在jdk6 update14时,就有了实验版本。而到了jdk7 update4之后移除了“Experimental”标识。它的目的是为了适应现在不断扩大的内存和不断增加的处理器数量,进一步降低暂停时间(pause time),同时兼顾良好的吞吐量。

weixin_39555954的博客 1万+

JVM】G1 垃圾收集器垃圾收集过程

G1 垃圾收集器垃圾收集过程

hui_zai_的博客 1605

JVM基础

字节码指令集可以直接看对照表hhh,操作时,会将操作数压进栈帧中操作数栈的栈顶。之后类似C语言cpu与变量存储(内存)和栈的交互,本地变量在栈帧的本地变量表中例:在栈顶压入常量:4将栈顶的数存入变量1

阿巴阿巴 741

阿里三年面试官:Java程序员搞懂这些技术点,随随便便吊打我

前言 过去2年我持续分享了BAT TMD为代表的大厂新面试题目,特别是蚂蚁金服、天猫、淘宝、头条、拼多多等Java面试题目。过去2年,我已经成功的帮助了部分同学进入了大厂。2020开始,我依然会为大家新的大厂现场面试专场题目,希望能帮助到更多的同学。回到正题,过完年后金三银四将正式到来,这是一个比较重要的涨薪季。 我知道很多同学早已经提前未雨绸缪了,已经提前在开始准备了。提前准备一直是我倡导的,任何事情你想要有预期的好的结果,那你就需要提前准备,提前准备,提前准备,重要的事情说三遍。 ...

JavaJIAMIN的博客 1306

复习Java,看了还不错的,资料搜集笔记

CountDownLunch(闭锁)、CyclicBarrier(栅栏锁)、Semaphore(信号量)的区别。分区只是一张表中的数据的存储位置发生改变,分表是将一张表分成多张表。分区和分表的目的都是减少数据库的负担,提高表的增删改查效率。当访问量大,且表数据比较大时,两种方式可以互相配合使用。当访问量不大,但表数据比较多时,可以只进行分区。作者不错:云扬四海(腾讯云社区)作者:HongXuan-Yuan。包含Phaser和exchange。todo 不会 字节流字符流。:如何实现按照指定顺序执行线程。

weixin_45438577的博客 1125

【一篇文章搞懂】小码农也有大梦想,顺利通过阿里Java岗面试

前言 在本篇文章开始前,我想想来回答一个问题:我为什么要写这一篇关于面试的文章? 原因有三:第一,我想为每一个为梦想时刻准备着的”有心人“尽一份自己的力量,提供一份高度精华的Java面试清单;第二,目前市面上的面试题不是答案不准确就是内容覆盖太窄,所以提供一份经典而又准确的面试题是非常有必要的;第三,本文会对部分提供详细解读和代码案例,让大家知其然并知其所然,从而学到更多的知识。 或许这份面试题还不足以概括所有Java问题,但有了它,我相信你一定不会”败“的很惨,因为有哦了它,足以应对目前市面上绝大部分的J

m0_56711468的博客 94

Ubuntu 20.04 安装 JDK 17 的版本选型与避坑指南

Java 是一种跨平台的高级编程语言,其运行依赖于特定版本的 JDK(Java Development Kit)。JDK 的版本选择并非简单执行 apt install 命令,而是需结合操作系统生命周期、LTS 支持策略与应用兼容性进行综合判断。Ubuntu 20.04 作为长期支持(LTS)发行版,原生适配 OpenJDK 11 和 JDK 17 这两个 LTS 版本,但默认源中 JDK 17 需通过 universe 仓库启用,且存在 headless 版本、alternatives 管理、JAVA_H

weixin_30697239的博客 321

鹅厂老将被拒,蚂蚁金服嘲讽,外包都没资格,Java界面试太刺激了

自从蚂蚁金服上市,IT界多了一批千万富翁后,去投奔的程序员愈发多了,进去了皆大欢喜,而折腾一圈还是没能入职的可就难过了。难过的是下面这位,在简历环节就直接被刷的。个人履历还不错,在腾讯...

Java后端技术 1039

财富自由了的蚂蚁金服,现在把面试门槛提到这么高了?

自从蚂蚁金服上市,IT界多了一批千万富翁后,去投奔的程序员愈发多了,进去了皆大欢喜,而折腾一圈还是没能入职的可就难过了。难过的是下面这位,在简历环节就直接被刷的。个人履历还不错,在腾讯...

芋艿V 1399

很酸-2021年全球程序员收入报告出炉

更多内容关注微信公众号:fullstack888一家全球性质的数据收集网站Levels.fyi发布了《2021年全球程序员收入报告》。这个报告主要针对科技公司级别的程序员的工资进行了统计分...

qianshanding0708的博客 6881

面试题333

1、spring的缓存,mybatis缓存2、介绍下dubbo。A服务调用B服务,B服务又调用C服务,这种情况怎么办3、JVM监控工具有哪些,区别又是什么(如能追上各个命令的使用监控,显得更好),如何调优的(就那么几个内存参数和GC参数什么时候配置什么样的)?如何定位问题的?(就说各种命令,gc日志,快照,监控工具)4、使用过Solr?说说(有面试特意想听从luence发展而来的可独立部署)5...

xiaomin1991222的专栏 183

Java面试八股文深度使用指南:从死记硬背到构建知识体系

在Java后端开发领域,面试准备常围绕JVM、并发编程、Spring框架等核心知识体系展开。理解这些技术原理而非单纯记忆答案,是构建扎实知识体系的关键。从计算机科学基础出发,掌握JVM内存模型、垃圾回收机制、并发控制原理等底层逻辑,能有效提升系统设计能力和问题排查效率。在实际工程实践中,这些知识关联着高并发场景下的性能优化、分布式系统稳定性保障等核心价值。本文以Java面试八股文为切入点,深入探讨如何通过结构化拆解、费曼学习法等科学方法,将零散知识点串联成网,并自然融入HashMap扩容机制、AQS等待队列

weixin_34081595的博客 517

NUMA架构深度解析:从硬件原理到应用优化实战

在多处理器系统中,内存访问架构是决定性能的关键因素之一。传统UMA架构下,所有CPU通过共享总线访问内存,随着核心数增加,总线拥塞成为瓶颈。NUMA架构通过将处理器和内存划分为多个节点,每个节点拥有本地内存,CPU访问本地内存延迟极低,但访问远程节点内存则会产生显著延迟。这种非均匀访问特性,使得NUMA成为现代多路服务器性能优化的核心机制。其技术价值在于通过分治策略提升系统可扩展性,并为内存密集型应用提供低延迟访问可能。在应用场景上,数据库、虚拟化平台、大数据计算框架等高性能服务,都需要通过NUMA优化来避

weixin_30634661的博客 371
上一篇: 22-大厂面试题:Con-current Mode Failure如何导致以及解决
下一篇: 24-一步一图带你理清G1垃圾回收流程
Open_Coder
博客等级 码龄5年 29粉丝 28原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值