文章插图
G1(Garbage First)垃圾收集器是目前垃圾回收技术最前沿的成果之一 。
G1 同 CMS 垃圾回收器一样,关注最小时延的垃圾回收器,适合大尺寸堆内存的垃圾收集 。但是,G1 最大的特点是引入分区的思路,弱化了分代的概念 , 合理利用垃圾收集各个周期的资源,解决了其他收集及 CMS 的很多缺陷 。
官方推荐使用 G1 来代替 CMS 。
通过本篇,我们可以了解掌握 G1 收集器的基本概念、堆内存、回收流程、GC模式、推荐用例等核心知识 。
文章插图
目录
- G1 收集器概述
- G1 的堆内存算法
- 1. G1 之前的 JVM 内存模型
- 2. G1收集器的内存模型
- G1回收流程
- 1. G1 收集器的阶段(步骤)
- G1 的 GC 模式
- 1. YoungGC 年轻代收集
- 2. mixed gc
- G1 的推荐用例
G1(Garbage First) 垃圾收集器,是关注最小时延的垃圾回收器,也同样适合大尺寸堆内存的垃圾收集,官方推荐选择使用 G1 来替代 CMS。
1. G1 收集器的最大特点
- G1最大的特点是引入分区的思路,弱化了分代的概念 。
- 合理利用垃圾收集各个周期的资源,解决了其他收集器、甚至 CMS 的众多缺陷 。
- 算法: G1 基于标记--整理算法, 不会产生空间碎片,在分配大对象时,不会因无法得到连续的空间,而提前触发一次 FULL GC。
- 停顿时间可控: G1可以通过设置预期停顿时间(Pause Time)来控制垃圾收集时间避免应用雪崩现象 。
- 并行与并发:G1 能更充分的利用 CPU 多核环境下的硬件优势,来缩短 stop the world 的停顿时间 。
- CMS 中 , 堆被分为 PermGen , YoungGen , OldGen ;而 YoungGen 又分了两个 survivo 区域 。在 G1 中,堆被平均分成几个区域 (region) ,在每个区域中,虽然也保留了新老代的概念,但是收集器是以整个区域为单位收集的 。
- G1 在回收内存后,会立即同时做合并空闲内存的工作;而 CMS ,则默认是在 STW(stop the world)的时候做 。
- G1 会在 Young GC 中使用;而 CMS 只能在 O 区使用 。
G1 垃圾收集算法,主要应用在多 CPU 大内存的服务中,在满足高吞吐量的同时 , 尽可能的满足垃圾回收时的暂停时间 。
在以下场景中,G1 更适合:
- 服务端多核 CPU、JVM 内存占用较大的应用(至少大于4G);
- 应用在运行过程中,会产生大量内存碎片、需要经常压缩空间;
- 想要更可控、可预期的 GC 停顿周期,防止高并发下应用雪崩现象 。
文章插图
- 新生代:伊甸园区 (eden space) + 2个幸存区
- 老年代
- 持久代 (perm space):JDK1.8 之前
- 元空间 (metaspace):JDK1.8 之后取代持久代
文章插图
2.1 G1 堆内存结构堆内存会被切分成为很多个固定大小区域(Region) , 每个是连续范围的虚拟内存 。
堆内存中一个区域 (Region) 的大?。梢酝ü?-XX:G1HeapRegionSize 参数指定,大小区间最小 1M 、最大 32M , 总之是 2 的幂次方 。
默认是将堆内存按照 2048 份均分 。
2.2 G1 堆内存分配每个 Region 被标记了 E、S、O 和 H,这些区域在逻辑上被映射为 Eden,Survivor 和老年代 。
存活的对象从一个区域转移(即复制或移动)到另一个区域 。区域被设计为并行收集垃圾,可能会暂停所有应用线程 。如上图所示,区域可以分配到 Eden,survivor 和老年代 。
此外,还有第四种类型,被称为巨型区域(Humongous Region) 。
【图文超详解 G1 垃圾收集器深入剖析】Humongous 区域主要是为存储超过 50% 标准 region 大小的对象设计,它用来专门存放巨型对象 。如果一个 H 区装不下一个巨型对象,那么 G1 会寻找连续的 H 分区来存储 。为了能找到连续的 H 区,有时候不得不启动 Full GC。
推荐阅读
- 图文全面详解 Kafka 架构和原理机制
- FlinkSql之TableAPI详解
- [Pyhton] SimPy 离散事件模拟框架详解 —— 以一个简单的汽车充电排队模拟为例
- JavaSPI详解
- 韩国女装品牌排行榜,百家好人气超高,第一主打甜美风格
- GCC 指令详解及动态库、静态库的使用
- 图文 Python 嵌入式打包
- 原神实验性超然灯怎么获得
- 华为手机怎么与电脑超级连接(华为手机连接电脑怎么调出密码)
- java中GC的日志认识详解