公司怎么做网站平台,免费申请httq,,网站?,互联网平台构建怎么写,石家庄站内换乘示意图文章目录 垃圾回收机制垃圾收集器垃圾收集器分类ZGC 收集器ZGC 的性能优势复制算法指针染色读屏障 ZGC 的工作过程Stop-The-World 暂停阶段并发阶段 垃圾回收机制
垃圾回收#xff08;Garbage Collection#xff0c;GC#xff09;#xff0c;顾名思义就是释放垃圾占用的空… 文章目录 垃圾回收机制垃圾收集器垃圾收集器分类ZGC 收集器ZGC 的性能优势复制算法指针染色读屏障 ZGC 的工作过程Stop-The-World 暂停阶段并发阶段 垃圾回收机制
垃圾回收Garbage CollectionGC顾名思义就是释放垃圾占用的空间当需要排查各种内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时我们就需要对这些“自动化”的技术实施必要的监控和调节。有效的使用可以使用的内存对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。
垃圾收集器
如果说收集算法是内存回收的方法论那么垃圾收集器就是内存回收的具体实现。Java 垃圾收集器Garbage Collector, GC是 Java 虚拟机JVM的一部分它自动管理内存回收不再使用的对象所占用的内存空间。这有助于防止内存泄漏并且使得开发人员可以更专注于业务逻辑的编写而不是内存管理。
没有万能的垃圾收集器只有根据具体应用场景选择适合自己的垃圾收集器。垃圾收集器是垃圾回收算法如引用计数法、标记清除法、标记整理法、复制算法等的具体实现。它的主要任务是识别并回收那些不再被程序使用的对象所占用的内存空间从而避免内存泄漏和内存溢出的问题。
垃圾收集器分类
就目前来说JVM 的垃圾收集器主要分为两大类分代收集器和分区收集器分代收集器的代表是 CMS分区收集器的代表是 G1 和 ZGC
JVMJava虚拟机垃圾回收机制 —— 垃圾收集器
JDK 默认垃圾收集器使用 java -XX:PrintCommandLineFlags -version 命令查看
JDK 8Parallel Scavenge新生代 Parallel Old老年代JDK 9 ~ JDK20: G1 ZGC 收集器
ZGCZ Garbage Collector 是一种低延迟、可伸缩性强的垃圾回收器是JVM 中的一项重要技术。ZGC的目标是 尽可能地减少垃圾回收对应用程序的停顿时间并且可以处理大内存堆 。
它于Java 11版本中正式发布适用于大内存低延迟服务的内存管理和回收在 128G 的大堆下最大停顿时间为 1.68 ms停顿时间远胜于 G1 和 CMS。 相关文章新一代垃圾回收器ZGC的探索与实践 - 美团技术团队 通过下面的参数启动 ZGC
$ java -XX:UseZGC classNameZGC的设计原则是给予应用程序更多的时间来执行业务逻辑以减少垃圾回收的停顿时间。它具有以下特点 低停顿时间ZGC 以毫秒为单位的短暂停顿时间作为目标在控制在10ms以内。它通过并发的方式进行垃圾回收减少对应用程序的影响。即使是大型堆内存ZGC也能维持非常低的停顿时间。 可伸缩性ZGC 的设计使其能够处理几个字节到数TB范围内的大型堆内存。它采用了柔性的并发策略允许在并行、并发和单线程模式之间根据需要做出动态调整。 不需要设置-Xmx与传统的垃圾回收器相比ZGC不要求显式设置最大堆大小。ZGC可以自动按需调整堆的大小并将内存释放给操作系统。 一致的性能ZGC致力于提供一致的性能无论是小型应用还是大型内存应用都希望能够获得稳定的延迟和吞吐量。
ZGC 的性能优势
与 G1 和 CMS 类似ZGC 也采用了复制算法
ZGC 在复制算法的基础上做了重大优化ZGC 在标记、转移和重定位阶段几乎都是并发的这是 ZGC 实现停顿时间小于 10ms 的关键所在。 ZGC 使用的是柔性并发Colored Pointers 的技术通过将对象指针分成多个颜色Colored指针染色技术以实现并发的垃圾回收。 它在垃圾回收过程中会对引用关系进行处理并且可以并发复制和重定向对象。同时ZGC 还采用了读屏障技术来保护并发操作中的数据一致性。
复制算法
复制算法主要包括以下 3 个阶段
标记阶段从 GC Roots 开始分析对象可达性标记出活跃对象。 对象转移阶段把活跃对象复制到新的内存地址上。 重定位阶段因为转移导致对象地址发生了变化在重定位阶段所有指向对象旧地址的引用都要调整到对象新的地址上。
标记阶段因为只标记 GC Roots耗时较短。但转移阶段和重定位阶段需要处理所有存活的对象耗时较长并且转移阶段是 STW 的因此G1 的性能瓶颈就主要在转移阶段。 指针染色
ZGC 在垃圾回收过程中会对引用关系进行处理并且可以并发复制和重定向对象。同时ZGC 还采用了读屏障技术来保护并发操作中的数据一致性。
在一个指针中除了存储对象的实际地址外还有额外的位被用来存储关于该对象的元数据信息。这些信息可能包括
对象是否被移动了即它是否在回收过程中被移动到了新的位置。对象的存活状态。对象是否被锁定或有其他特殊状态。
通过在指针中嵌入这些信息ZGC 在标记和转移阶段会更快因为通过指针上的颜色就能区分出对象状态不用额外做内存访问。
ZGC 仅支持64位系统它把64位虚拟地址空间划分为多个子空间如下图所示 其中
0-4TB 对应 Java 堆4TB-8TB 被称为 M0 地址空间8TB-12TB 被称为 M1 地址空间12TB-16TB 预留未使用16TB-20TB 被称为 Remapped 空间。
当创建对象时首先在堆空间申请一个虚拟地址该虚拟地址并不会映射到真正的物理地址。同时ZGC 会在 M0、M1、Remapped 空间中为该对象分别申请一个虚拟地址且三个虚拟地址都映射到同一个物理地址。
下图是虚拟地址的空间划分 三个空间在同一时间只有一个空间有效。ZGC 之所以设置这三个虚拟地址是因为 ZGC 采用的是“空间换时间”的思想去降低 GC 的停顿时间。与上述地址空间划分相对应ZGC 实际仅使用64位地址空间的第0-41位而第42-45位存储元数据第47-63位固定为0。 由于仅用了第 0~43 位存储对象地址 2 44 2^{44} 244 16TB所以 ZGC 最大支持 16TB 的堆。而对象的存活信息则存储在42-45位中这与传统的垃圾回收并将对象存活信息放在对象头中完全不同。
读屏障
当程序尝试读取一个对象时读屏障会触发以下操作 检查指针染色读屏障首先检查指向对象的指针的颜色信息。 处理移动的对象如果指针表示对象已经被移动例如在垃圾回收过程中读屏障将确保返回对象的新位置。 确保一致性通过这种方式ZGC 能够在并发移动对象时保持内存访问的一致性从而减少对应用程序停顿的需要。
读屏障可能被 GC 线程和业务线程触发并且只会在访问堆内对象时触发访问的对象位于 GC Roots 时不会触发这也是扫描 GC Roots 时需要 Stop The World 的原因。
下面是一个简化的示例代码展示了读屏障的触发时机。
Object o obj.FieldA // 从堆中读取引用需要加入屏障
Load barrier
Object p o // 无需加入屏障因为不是从堆中读取引用
o.dosomething() // 无需加入屏障因为不是从堆中读取引用
int i obj.FieldB //无需加入屏障因为不是对象引用ZGC 的工作过程
ZGC 周期由三个 STWStop The World 暂停和四个并发阶段组成标记/重新映射(M/R)、并发引用处理(RP)、并发转移准备(EC) 和 并发转移(RE)。 Stop-The-World 暂停阶段 标记开始Mark StartSTW 暂停这是 ZGC 的开始进行 GC Roots 的初始标记。在这个短暂的停顿期间ZGC 标记所有从 GC Root 直接可达的对象。 重新映射开始Relocation StartSTW 暂停在并发阶段之后这个 STW 暂停是为了准备对象的重定位。在这个阶段ZGC 选择将要清理的内存区域并建立必要的数据结构以进行对象移动。 暂停结束Pause EndSTW 暂停ZGC 结束。在这个短暂的停顿中完成所有与该 GC 周期相关的最终清理工作。
并发阶段 并发标记/重新映射 (M/R) 这个阶段包括并发标记和并发重新映射。在并发标记中ZGC 遍历对象图标记所有可达的对象。然后在并发重新映射中ZGC 更新指向移动对象的所有引用。 并发引用处理 (RP) 在这个阶段ZGC 处理各种引用类型如软引用、弱引用、虚引用和幽灵引用。这些引用的处理通常需要特殊的考虑因为它们与对象的可达性和生命周期密切相关。 并发转移准备 (EC) 这是为对象转移做准备的阶段。ZGC 确定哪些内存区域将被清理并准备相关的数据结构。 并发转移 (RE) 在这个阶段ZGC 将存活的对象从旧位置移动到新位置。由于这一过程是并发执行的因此应用程序可以在大多数垃圾回收工作进行时继续运行。
ZGC 的两个关键技术指针染色和读屏障不仅应用在并发转移阶段还应用在并发标记阶段将对象设置为已标记传统的垃圾回收器需要进行一次内存访问并将对象存活信息放在对象头中而在 ZGC 中只需要设置指针地址的第42-45位即可并且因为是寄存器访问所以速度比访问内存更快。 尽管ZGC在降低停顿时间方面表现出色但与其他垃圾回收器相比在某些特定场景或对于特定应用程序可能会有一些性能上的差异。因此在选择垃圾回收器时需根据具体需求和应用程序特点进行评估和选择。