Products
GG网络技术分享 2026-04-16 15:08 2
日常我们的服务应用进行分布式部署, 单节点不需要扛很高的并发,一个服务给到2~4G就足够用,如果不是计算密集型应用,一个节点给到8G就能支撑很高的并发。而为大内存而生的G1,如果普通应用采用G1做GC回收,无疑有一种杀鸡焉用牛刀的感觉。但因为研发经验的不断积累, 业务量提升,不断涉足富有挑战的性能问题,以及面试造航母的需要,了解、掌握、实践G1垃圾回收器将是一条必经之路,我始终觉得...。
2024好事接龙,拉丁解牛祝愿所有有缘刷到的同学,好事发生,喜事连连。读书笔记:在发现自己情绪不对时候, 实锤。 需要积极按下暂停键,让原始大脑冷静下来等自我感觉好了再专注于解决问题的方案。不能被逻辑后果带偏。

体系化地讲解大模型技术,助力读者实现 offer直提 。还有啊,尼恩还分享了多个技术圣经,如、等,帮助读者深入理解核心技术。 技术自由圈/原疯狂创客圈云原生微服务 热门文章 最新文章 ASP.NET Core微服务之基于Consul实现服务治理 Java微服务开发指南 -- 使用Spring Boot构建微服务 初识SpringCloud集群/分布式/微服务/SOA的相关概念 阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 11 月产品动态 从单体到微服务:如何借助 Spring Cloud 实现架构转型 JVM进阶调优系列敢向stop world喊卡的G1垃圾回收器 | 有必要讲透 image.png,我们都曾是...
G1,全称是 Garbage First,顾名思义。G1垃圾回收器以GC低延时处理为核心目标。在2011年,JDK7开始支持-XX:+UseG1GC使用G1垃圾回收器进行GC回收。并在2012年,G1 开始面世商用。记得在2013、 2014年大数据计算开始火遍千家万户时候,移动互联网浪潮的海量数据、高并发场景应用,让应用对内存、CPU的依赖开始大幅上升。时间来到2017年, JDK 9的腾空出世,直接把G1设置为默认垃圾处理器,这种面向大内存多处理器的垃圾回收器,让后端服务器应用有了更优的选择,很棒。。
在G1出现之前,我们JVM参数里通常从多个分代收集器里进行组合配置。比如年轻代有Serial、 ParNew、Parallel Scavenge回收器可选,老年代有CMS、Serial Old、Parallel Old可选。但是这些垃圾回收器都有一个痛点, 就是GC stop world会导致系统卡顿,而且卡顿时间是不可预知不可控。特别是JVM 堆内存达到8G、 16G、甚至32G的时候,这时候发生GC,需要回收的对象很多,自只是然GC的时间会被拉长,可能从以往我们熟悉的FGC也就几百毫秒,上升到几s,甚至10+s,恕我直言...。
而G1, 支持指定最大GC停顿时间-XX:MaxGCPauseMillis=200ms的特点,直接让之前分代垃圾处理器望尘莫及。G1的出现,开启了JVM分区回收的新时代。 摸鱼。 此后JAVA 在2019年, JDK12引入了收集器ShenandoahGC;同年发布JDK13,引入了增强ZGC收集器,都是分代回收器。
| 产品名称 | 核心功能简介 | 适用场景 | 推荐指数 |
|---|---|---|---|
| 阿里云微服务引擎 MSE | 提供注册配置中心、 微服务治理及云原生API网关 | 微服务架构转型与K8s容器化升级 | ★★★★★ |
| EDAS 4.0 | 企业级分布式应用服务,助力一站式微服务架构转型 | 企业级应用全生命周期管理 | ★★★★☆ |
| 无影云电脑 | 云桌面服务,免费试用最长3个月 | 远程办公、开发环境搭建 | ★★★☆☆ |
| Nacos | 服务动态发现与流量调度 | 微服务注册中心与配置管理 | ★★★★★ |
很明显, GC 的stop world,会让我们的服务出现明显的卡顿,对核心业务这是不可接受的。目前主流开源框架Hbase、Elastic search,都是通过Java开发实现。因为版本迭代, 以及用户数据存储增长,每个节点需要8G,16G,甚至更多时候,如果使用CMS垃圾回收器难以满足应用需要,这些框架至少要升级切换到G1垃圾回收器。
太顶了。 而其实吧, 堆内存结构如如下虽然内存被分为一块块大小固定的Region区,但是里面多个Region组成年轻代、老年代,还有一个新增的Humongous区。这个H区是专门用来存放大对象的区, 相当于之前老年代的存放大对象,具体如下:
换个角度。 对G1垃圾回收器堆内存情况的第一印象,满眼都是Region块,如图:
绿色的块,是年轻代Young区。灰色的块是老年代Old区,而红色的是Humongous大对象区。在年轻代里的Young区, 实际上... 实际还会保留继续划分Eden区、S区。比如下图,绿色的是年轻代的suvivor区,浅蓝色的年轻代的Eden区。
由于堆内存不再强制按连续的内存空间划分年轻代、老年代。老年代和年轻代只是逻辑上的概念空间,实际内存空间是靠一个个Region块组成。刚才的图看起来Region是连续的,实际并不是。说实在的JVM每次需要新的Region块,就在JVM里随机找一块内存空间分配给新的Region区。具体如下如:,到位。
说白了... 对堆内存结构有了基本认识之后我们尝试理解更深入的架构原理。先说说Region为什么要把堆内存分拆成一个个块?这样做的优点是什么?「拉丁解牛说技术,实用至上,坚持用最简洁直白的文字+最少的代码示例分享干货。」
G1的核心思想就是内存分区回收。体现在堆内存不再仅仅是年轻代和老年代的简单划分,而增加了Region 的概念。将堆内存切分成一块块大小独立而且大小固定的Region区,多个Region 可以动态的组合成年轻代和老年代内存空间。
心情复杂。 在G1垃圾收集器里 最开始堆内存只会给年轻代大概5%,比如8G内存,大概就是400Mb,按默认region块数量是2048个,那每个region大小就是4Mb。「拉丁解牛说技术,实用至上,坚持用最简洁直白的文字+最少的代码示例分享干货。」
现在Java服务启动, 因为时间推移,年轻代的初始大小400Mb被全部占完,这400M里其中E:S1:S0=8:1:1的比例和之前一样,Eden区大概占用了320Mb,S区各占40Mb。这时候G1不一定要进行YGC, 它先说说要评估,这些年轻代的region的回收时间,如果远低于XX:MaxGCPauseMills这个核心GC指标,就暂时不进行YGC。继续分配新region给年轻代, 到头来年轻代可以达到-XX:G1MaxNewSizePercent,默认是60%,也就是4.8G大小。这期间, 如果发现年轻代gc的时间,接近XX:MaxGCPauseMills设置值,就必须开始做YGC。
G1的目标很简单。官方对G1的期待是让GC时间可控,以及尽可能的降低GC时间开销, 也是醉了... 到头来替代CMS垃圾处理器。这是典型做最有挑战的事,实现最清晰明了的目标。
G1的垃圾回收,不再是对某一片连续的分代内存进行GC,而是对全局的region块进行gc,在GC前,可以对每个region 的回收价值做好充分评估排序。G1, 可以实现在有限gc时间内,迅速的将那种存活对象少且占用空间较大的region优先回收。这就是G1 Garbage First的GC目标,他急了。。
G1在GC发生后一个Region 的存活对象会被移动到另一个Region块上。而且重新腾空的Region块,可以从之前的角色自由切换。 蚌埠住了! 比如之前这个Region是用来作为Eden区的内存, 现在可以作为S区、或者H区、又或者Old区的Region块。
也是醉了... YGC过程大体和之前的分代回收类似,采用的是复制算法。简单的说:先说说将Eden、 S区,存入新的S区的Region块,或者存活对象年龄大于MaxTenuringThreshold参数以及其他可进入老年代的条件,就存入老年代的region块。然后清空参与GC的Eden、S区的region块,供年轻代、或者大对象区、老年代分配使用。
排除YGC, 以及Full GC,这里重点说Mixed GC混合GC过程。混合回收,会对年轻代、老年代、大对象区region进行GC回收。触发条件是-XX:InitiatingHeapOccupancyPercent参数控制, 别担心... 默认值是45%。也就是老年代的存储空间应用占比达到该参数值,G1就触发进行mixed GC。采用的算法还是复制算法,所以G1没有内存碎片,这个比CMS的算法更有优越香。CMS需要配置参数进行内存整理,才能解决内存碎片问题。
我无法认同... 在发生混合GC的时候,往往大对象,老年代都已经有很多对象。这个GC过程主要分四个阶段:初始标记、并发标记、重新标记、清理。
体验感拉满。 当内存分配失败, 或者没有足够内存给存活对象,元数据区内存不足等,G1就触发full gc。但是其实吧JVM选择SerialOld收集器施行STW进行全面回收。虽然我们选择了G1垃圾回收器, 但是发生Full gc的时候,JVM会自动切换使用SerialOld进行FullGC。
YYDS! JVM的调优,重中之中就是FullGC的优化。FullGC由于Stop world耗时大,快的的几秒,慢的几十秒,对业务的正常运行造成了负面影响。本文主角CMS垃圾回收器在对FullGC做了充足的优化,值得深入探讨学习。 拉丁解牛说技术JVM进阶调优系列CMS回收器通俗演义一文讲透FullGC 腾讯云... 放不下,这时候会发生Concurrent mode failure,而不是OOM。这时候JVM自动使用Serial Old垃圾回收器替换CMS回收器,强行让程序stop word,程序暂停运行,不允许新对象生成。直到GC完成后再...
我们从堆内存初始状态, 到堆内存占用几乎占满,发生FullGC一步步讲解。这个过程会先后触发YGC、 CPU你。 Mixed GC、Full GC,然后再具体分析gc过程。
何必呢? 本阶段会进行一次stop world, 并用单线程GC去标记所有GC roots,以及标记GC roots直接可达的对象。本阶段耗时很短。
该阶段不会stop world,程序恢复运行。多个GC线程开始并发标记递归 GCroots可以触达的所有对象, 除了直接关联roots的, 何不... 还有对象相互引用的,在这个阶段都会被标记出来。该过程比初始阶段耗时大,但是好在是并发施行,且没有stop world。
由于并发标记阶段, 程序继续运行会出现新的垃圾对象,以及可能有重新被引用的对象。所以这次也要stop world确保标记准确无误。
开始对每个region块的回收价值进行评估排序,并进行选择性的多线程GC回收。该过程会将参与gc回收region存活对象,复制到新region块,并更新相关引用。该过程是也是并发施行。
这里再补充一点,从region回收角度看,G1就是纯纯的复制算法,非常高效。从全局来看,存活的对象需要放到新分配的region块,这是标记-清除算法。再说说起来GC的GC算法,细节上看是复制算法,整体是标记-清除算法。
今天内容目录概要:
-XX:MaxGCPauseMills,设置GC预期回收停顿时间值,G1默认为200ms。 -XX:G1MixedGCCountTarget,混合回收时的目标回收次数。当G1在GC达到停顿时间目标的情况下将分成该参数设置次数完成回收。 -XX:G1MixedGCLiveThresholdPercent, 在混合回收期间,当一个Region中的存活对象超过Region大小的百分比时不对该Region进行回收,躺平...。
默认情况下这个值是堆内存的1/2000。
我当场石化。 默认值45%。 -XX:PretenureSizeThreshold,设置被作为大对象的阈值。默认是一个region块的大小的一半。 -XX:ParallelGCThreads,并发回收线程数量。 -XX:G1MaxNewSizePercent,设置年轻代最大百分比,默认60%。 -XX:G1HeapRegionSize, 设置每个region块的大小,必须是2的幂,范围在1MB到32MB之间。
默认值是85%。 +G1EagerReclaimHumongousObjects, YGC时是否回收大对象 ,默认是true。 -XX:G1NewSizePercent,设置年轻的初始占比,默认是5%。 -XX:ConcGCThreads,参与并发标记线程数量。 -XX:InitiatingHeapOccupancyPercent, 当年老代的存储占有率达到该参数值,G1会进行MixedGC,吃瓜。。
精神内耗。 推荐阅读拉丁解牛_JVM专题系列: 6、 JAVA并发编程系列Future、FutureTask异步小王子 5、JVM进阶调优系列类加载器原理一文讲透 4、JVM进阶调优系列字节面试:JVM内存区域怎么划分,分别有什么用? 3、 JVM进阶调优系列堆内存的对象什么时候被回收? 2、JVM进阶调优系列年轻代和老年代采用什么GC算法回收? 1、JVM进阶调优系列CMS回收器通俗演义一文讲透FullGC
先推荐一篇实用的文章《Java并发编程学习13-任务取消的进阶使用》,作者是。 huazie在并发编程领域进行持续专题分享, 他的这篇内容重点介绍了多线程并发如何中断取消任务的机制,并对Future接口、不可中断阻塞IO、ThreadPoolExecutor的newTaskFor进行详细案例分析,实用借鉴性强,特此推荐给大家。 还有啊在我们拉丁解牛JVM专题之前也分享了《JAVA并发编程》专栏,目前连载到13篇。感兴趣的同学欢迎关注。
至于吗? 文章还将分享一系列 一行代码,保障分布式事务一致性—GTS:微服务架构下分布式事务解决方案 阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 11 月产品动态 从单体到微服务:如何借助 Spring Cloud 实现架构转型 JVM进阶调优系列敢向stop world喊卡的G1垃圾回收器 | 有必要讲透 JVM进阶调优系列(...
综上: -----------------------------正式开启我们JVM系列正文---------------------- 版权JVM调优进阶专栏收录该内容10 篇文章0 订阅 读书笔记:在发现自己情绪不对时候,需要积极按下暂停键,让原始大脑冷静下来,等自我感觉好了,再专注于解决问题的方案。不能被逻辑后果带偏 欢迎同学们关注支持~
Demand feedback