JVM中的垃圾回收暂停是什么,为什么会出现暂停,不同的垃圾回收机制暂停对比

JVM中的垃圾回收暂停是什么?

在Java虚拟机(JVM)中,垃圾回收暂停(Garbage Collection Pause),也称为“Stop-The-World”事件,是指当垃圾收集器执行特定阶段时,所有应用程序线程都会被暂时停止,直到该阶段完成。这种暂停是为了确保垃圾收集过程能够正确地识别和回收不再使用的对象而不受到其他线程的干扰。

为什么会出现暂停?

出现暂停的主要原因是为了保证数据一致性:

  1. 标记阶段:在许多垃圾收集算法中,如标记-清除(Mark-Sweep)、复制(Copying)、标记-整理(Mark-Compact),都需要首先确定哪些对象是存活的(即仍有引用指向它们),哪些是可以回收的。为了准确地识别这些信息,JVM必须保证在这段时间内没有其他线程修改对象图,否则可能会导致错误地将存活的对象标记为可回收,或者反之亦然。因此,在标记阶段,所有用户线程会被暂停。
  2. 移动对象:对于某些类型的垃圾收集器,比如那些使用压缩技术来减少内存碎片化的收集器(例如CMS和G1中的某些模式),它们不仅需要识别哪些对象是活的,还需要移动这些对象以释放连续的空间。如果在这个过程中允许其他线程继续运行,则可能导致指针丢失或指向无效位置的问题。为了避免这种情况,也需要暂停所有应用线程。
  3. 并发标记的限制
    尽管有些现代垃圾收集器(如CMS、G1、ZGC等)设计为可以在大部分时间内与应用程序并发运行,但在某些关键点上仍然不可避免地需要短暂的停顿。例如,在CMS中,虽然大部分工作可以并行于应用线程进行,但在初始标记和重新标记阶段仍需短暂停顿;而在G1中,虽然大多数收集活动都可以并发执行,但最终的清理和部分标记阶段也可能需要短暂的STW事件。
  4. 简化实现:从实现角度来看,完全避免STW事件会使垃圾收集器的设计变得极其复杂。通过引入有限的STW时段,可以使垃圾收集器的设计更加简单高效,同时也能更好地控制内存管理的准确性。

如何减少GC暂停的影响?

虽然完全消除GC暂停是不可能的,但是可以通过选择合适的垃圾收集器以及调整其参数来最小化这些暂停的影响:

  • 选择适当的GC算法:不同的GC算法有不同的特性。例如,G1旨在提供更可预测的停顿时间,并且允许设置最大停顿目标。
  • 优化堆大小:合理配置堆内存大小(-Xms, -Xmx)可以帮助减少频繁的GC操作,尤其是Full GC的发生频率。
  • 调整新生代与老年代的比例:适当调整新生代(-XX:NewRatio)的大小有助于减少对象晋升到老年代的速度,从而降低老年代的GC压力。
  • 使用低延迟GC:像ZGC和Shenandoah这样的新型垃圾收集器专门设计用于最大限度地减少停顿时间,适合对延迟敏感的应用程序。

不同垃圾回收机制下的暂停对比

不同的垃圾收集器有不同的工作方式,这直接影响了它们如何处理暂停以及暂停的频率和持续时间。

1. Serial GC
  • 描述:单线程垃圾收集器,适用于单核处理器环境或小型应用。
  • 暂停特性:所有的GC操作都是串行执行的,这意味着每次GC都会导致一次完整的Stop-The-World暂停。由于它是单线程的,所以暂停时间相对较长,尤其是在处理大堆时。
2. Parallel GC
  • 描述:多线程版本的Serial GC,适用于多核处理器上的高吞吐量需求场景。
  • 暂停特性:虽然Young Generation和Old Generation的收集可以并行执行,但仍然涉及Stop-The-World暂停。相比Serial GC,它减少了总的GC暂停时间,因为多个线程同时工作,但是每个暂停事件仍然是全系统的。
3. CMS (Concurrent Mark-Sweep) GC
  • 描述:旨在减少GC停顿时间的老年代收集器,适合响应时间敏感的应用。

  • 暂停特性

    • 初始标记:短暂的STW事件,标记直接从根可达的对象。
    • 并发标记:与应用程序并发进行,不造成停顿。
    • 再标记:另一个短暂停顿,用于修正并发标记期间发生的变动。
    • 并发清除:与应用程序并发进行,清理未被标记为存活的对象。

    尽管大部分工作可以在后台进行而不影响应用程序,但在初始标记和再标记阶段仍会有短暂的暂停。

4. G1 GC
  • 描述:一种区域化的垃圾收集器,旨在提供可预测的低延迟。

  • 暂停特性

    • Young GC:主要针对年轻代,通常具有较短的停顿时间。
    • Mixed GC:包括年轻代和部分老年代的收集,目标是在不超过设定的最大停顿时间内尽可能多地回收垃圾。
    • Full GC:作为最后手段,在G1无法满足性能目标时触发,这会导致较长的停顿。

    G1通过分区策略和增量式收集来尽量缩短停顿时间,并允许设置期望的最大停顿时间(-XX:MaxGCPauseMillis)。

5. ZGC
  • 描述:专为低延迟设计的垃圾收集器,支持非常大的堆(TB级别)。
  • 暂停特性:几乎所有的GC工作都可以并发执行,只有少量且非常短暂的STW事件用于根扫描等关键步骤。这些暂停通常在几毫秒以内,极大地减少了对应用程序的影响。
6. Shenandoah
  • 描述:类似于ZGC,专注于极低的暂停时间,支持大堆大小。
  • 暂停特性:除了极少的、非常短的STW事件外,几乎所有的工作都可以与应用线程并发执行。Shenandoah通过转发指针技术解决了并发移动对象的问题,从而实现了更低的暂停时间。

总结

不同的垃圾收集器根据其设计目标提供了不同程度的停顿优化。对于需要最小化GC停顿的应用程序,如实时系统或对响应时间敏感的服务,选择像ZGC或Shenandoah这样的现代垃圾收集器可能是最佳选择。而对于更注重吞吐量的应用,可能更适合使用Parallel GC或CMS。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92098.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spearman 相关系数与 Pearson 相关系数的区别

核心区别对比表特征Pearson 相关系数Spearman 相关系数相关性类型线性相关单调相关计算基础原始数据值数据排名(秩)公式数据要求连续变量,近似正态分布有序数据或连续变量异常值敏感性高度敏感不敏感取值范围[-1, 1][-1, 1]单调关系检测仅检测…

sqli-labs靶场less36-less40

less361.我们打开靶场之后打开来看一下,输入的内容会被转义,依旧是宽字节注入2.使用以下宽字节注入,使用的是%df?id-1%df%27%20union%20select%201,database(),3--3.剩余内容与前面关卡基本一样,只要使用上面的方法合成宽字节即可…

企业级 TinyMCE Vue 编辑器解决方案 – 配置优化与性能提升指南、自定义插件

## 简介TinyMCE Vue 是官方提供的 TinyMCE 富文本编辑器的 Vue 组件封装,支持 Vue 2 和 Vue 3。它让你可以在 Vue 项目中快速集成强大的富文本编辑能力,支持多种插件、主题和自定义扩展,适用于博客、内容管理、后台系统等多种场景。主要特性&…

【模电笔记】—— 直流稳压电源——稳压电路

Tips:本章节笔记建议读者综合学习,内容较多,可谓是模电相当重要的部分,因此部分知识点没有做到详细解释。 1.稳压电路的性能指标 (同上节直流稳压电源的主要技术指标【模电笔记】—— 直流稳压电源——整流、滤波电路…

C++——设计模式

文章目录一、面向对象的优点和缺点1.1 回答重点1.2 扩展知识二、面向对象的三大特点2.1 回答重点2.2 扩展知识三、设计模式的六大原则3.1 回答重点3.1.1 单一职责原则(Single Responsibility Principle, SRP)3.1.2 开放 - 封闭原则(Open-Clos…

Android PDFBox 的使用指南

Android PDFBox 使用指南 概述 PDFBox是一个强大的PDF处理库,在Android平台上也有对应的实现。本指南将介绍如何在Android项目中使用PDFBox进行PDF文件的加载、读取、修改等操作。 依赖配置 在 app/build.gradle 中添加PDFBox依赖: dependencies {i…

TFTP: Linux 系统安装 TFTP,文件系统启动后TFTP使用

安装 TFTP 服务器 sudo apt update sudo apt install tftpd-hpa配置 TFTP 服务器 编辑配置文件 /etc/default/tftpd-hpa: sudo nano /etc/default/tftpd-hpa 修改内容如下: TFTP_USERNAME"tftp" TFTP_DIRECTORY"/srv/tftp" TFTP_ADD…

昇思+昇腾开发板+DeepSeek模型LoRA微调

昇思昇腾开发板DeepSeek模型LoRA微调 LoRA微调原理核心思想:冻结预训练模型权重,仅训练橙色的低秩适配矩阵(A/B矩阵)优势: 训练参数量减少至全量微调的0.5%显存占用降低50%以上适配器权重仅需保存3MB(原模型…

计算机网络:详解网络地址的计算步骤

网络地址计算是网络规划与配置的基础,核心是通过IP地址和子网掩码确定网络标识、广播地址、可用主机范围等关键信息。以下是详细的计算步骤,配合实例说明(以IPv4为例): 一、明确基础概念 在计算前,需先明确3个核心概念: IP地址:标识网络中主机的32位二进制数,通常以…

Spring AI 系列之三十五 - Spring AI Alibaba-Graph框架之MCP

之前做个几个大模型的应用,都是使用Python语言,后来有一个项目使用了Java,并使用了Spring AI框架。随着Spring AI不断地完善,最近它发布了1.0正式版,意味着它已经能很好的作为企业级生产环境的使用。对于Java开发者来说…

FastAPI后端工程化项目记录

以下是一个使用fastapi上传视频的接口,记录一下工程化后端程序的业务逻辑 重点是代码如何抽离 项目结构优化 project/ ├── .env # 环境变量配置 ├── app/ │ ├── __init__.py │ ├── main.py # 主应用入口 │ …

令牌桶限流算法

你提供的 Java 代码实现的是令牌桶限流算法(Token Bucket Algorithm),这是目前最常用、最灵活的限流算法之一。它允许一定程度的“突发流量”,同时又能控制平均速率。下面我将:逐行详细解释 TokenBucketLimiter 类的每…

基于springboot的宠物商城设计与实现

管理员:登录,个人中心,用户管埋,宠物分类管理,宠物信息管理,留言反馈,宠物论坛,系统管理,订单管理用户:宠物信息,宠物论坛,公告信息&a…

Python day36

浙大疏锦行 Python day36. 复习日 本周内容: 如何导入模块以及库项目的规范拆分和写法官方文档的阅读MLP神经网络的训练在GPU上训练模型可视化以及推理

【gaussian-splatting】用自己的数据复现高斯泼溅(一)

1.环境准备1.1.下载diff-gaussian-rasterization这里本来没啥说的,直接从github上下载就行了,但是我踩坑了,下的版本不对,后续运行报错参数个数对不上,特在此给大家避坑,注意一定要下带3dgs版本的diff-gaus…

中国移动h10g-01_S905L处理器安卓7.1当贝纯净版线刷机包带root权限_融合终端网关

下载固件之前请先将主板上的屏蔽罩取下,查看处理器型号 是否为S905L型号,然后再下载固件进行刷机; 本页面的固件是采用双公头数据线进行刷机的哈; 安卓4.4.2版本固件下载地址:点此进行下载 安卓7.1版本固件下载地址…

夜天之书 #110 涓滴开源:Cronexpr 的故事

在年初的一篇关于商业开源的博文当中,我介绍了在开发商业软件的过程中,衍生出开源公共软件库的模式。在那篇博文里面,我只是简单罗列了相关开源库的名字及一句话总结。近期,我会结合商业开源实践的最新进展,对其中一些…

完整的登陆学生管理系统(配置数据库)

目录 要求 思路 1. 登录模块(LoginFrame.java) 2. 学生信息管理模块(StudentFrame.java) 3. 数据层(StudentDAO.java) 4. 业务层(StudentService.java / UserService.java) 5…

译 | 在 Python 中从头开始构建 Qwen-3 MoE

文章出自:基于 2个Expert 的 MoE 架构分步指南 本篇适合 MoE 架构初学者。文章亮点在于详细拆解 Qwen 3 MoE 架构,并用简单代码从零实现 MoE 路由器、RMSNorm 等核心组件,便于理解内部原理。 该方法适用于需部署高性能、高效率大模型&#x…

Spring Boot + ShardingSphere 分库分表实战

🚀Spring Boot ShardingSphere 实战:分库分表,性能暴增的终极指南! ✅ 适用场景:千万级大表、高并发、读写分离场景 ✅ 核心框架:Spring Boot 3.x ShardingSphere-JDBC 5.4.1 ✅ 数据库:MySQL…