Java 内存碎片(Memory Fragmentation)指的是:在 JVM 管理的内存中,虽然总空闲内存足够,但这些空闲内存被分割成了许多不连续的小块,导致无法分配一个需要连续内存空间的大对象,从而引发性能问题甚至 OOM(OutOfMemoryError)。
Java 内存碎片主要发生在 堆内存 中,尤其是 老年代(Old Generation)。
常见原因:
✅ 举例:
空闲 10MB,但分成 1MB × 10 块
需要分配 5MB 连续对象 → 失败
✅ 举例:
分配 16 字节,实际只用 10 字节
剩余 6 字节浪费
Java 中更关注 外部碎片
| GC 收集器 | 是否整理内存 | 碎片风险 |
|---|---|---|
| Serial / Parallel GC | ✅ 会压缩 | 低 |
| CMS | ❌ 不压缩 | ⚠️ 高 |
| G1 | ✅ 分区整理 | 中 |
| ZGC / Shenandoah | ✅ 并发整理 | 低 |
CMS 是最容易产生内存碎片的经典收集器
OutOfMemoryError: Java heap space-XX:+UseG1GC
或
-XX:+UseParallelGC
-XX:+PrintGCDetails
Java 内存碎片 = 空闲内存不少,但“碎”得用不了,最终导致分配失败或 GC 频繁。
如果你愿意,我也可以结合 CMS / G1 的回收过程图 或 真实 OOM 案例 给你讲得更直观。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。