JVM中堆内存碎片化问题怎么通过不同垃圾回收器算法解决

大明同学_4758

大明同学_4758

2026-06-08

478人浏览

原创

堆内存碎片化会阻碍大对象分配并触发频繁gc或oom;标记-清除类(如cms)不移动对象、留碎片;复制类(如serial、g1年轻代)天然无碎片但空间减半;标记-整理类(如g1混合回收、zgc、shenandoah)边回收边压缩,兼顾空间利用率与低碎片。

jvm中堆内存碎片化问题怎么通过不同垃圾回收器算法解决

堆内存碎片化会影响大对象分配,导致频繁触发GC甚至OOM。不同垃圾回收器通过底层算法差异,对碎片问题采取了截然不同的应对策略。

标记-清除类回收器:不处理碎片,只留隐患

CMS 是典型代表。它在老年代使用标记-清除算法:先标记存活对象,再直接清理未标记区域。这种做法不移动对象,所以停顿短、响应快,但会留下大量不连续的空闲块。当需要分配一个较大对象(比如 4MB)时,即使总空闲内存充足,也可能因找不到连续空间而失败,被迫触发 Full GC。这也是 CMS 在 JDK 9 后被弃用的重要原因之一。

AI-Text-Classifier
AI-Text-Classifier

AI-Text-Classifier是 OpenAI 曾推出的一款用于判断文本是否由 AI 生成的实验性检测工具。

下载

复制类回收器:天然无碎片,代价是空间减半

Serial、Parallel Scavenge 和 G1 的年轻代回收都采用复制算法。它们把内存划为 Eden + Survivor(或 G1 中的多个 Region),GC 时只把存活对象复制到另一块空闲区域,原区域整块清空。结果是每次回收后,目标区域始终紧凑连续,完全规避碎片。缺点也很明显:必须预留等量备用空间,实际可用堆容量打折扣;且对象存活率高时,复制开销陡增。

标记-整理类回收器:边回收边压缩,主动消除碎片

G1、Parallel Old、ZGC 和 Shenandoah 都在老年代或全堆层面引入了整理逻辑。G1 在混合回收阶段会选定若干 Region,将其中存活对象复制到其他 Region,腾出整块干净空间;Parallel Old 则直接将老年代存活对象向一端滑动压缩;ZGC 和 Shenandoah 更进一步,在应用线程运行的同时并发完成对象移动与引用更新,实现“零停顿+无碎片”。这类方式不牺牲空间利用率,但需额外处理对象移动和指针重定向,带来一定 CPU 开销。

选择建议:看场景,不唯参数

– 如果应用对延迟极度敏感(如高频交易、实时风控),且堆不大,ZGC 或 Shenandoah 是首选,它们能持续维持低碎片率;
– 如果追求吞吐量、堆较大(>32GB)、可接受百毫秒级停顿,G1 更均衡;
– 如果系统老旧、堆较小( – 新项目避免使用 CMS,它不解决碎片,反而因碎片加剧 GC 压力。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

垃圾回收器

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5127

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2268

6

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

2023.08.14

5256

4

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

80

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

80

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

60

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

60

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

280

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习