在 Java 中,“内存碎片”通常指 堆内存碎片(Heap Fragmentation),主要分为两类:
下面从 JVM 层面 和 代码/设计层面 系统说明如何处理。
不同 GC 对碎片处理能力差异很大:
| GC | 碎片处理能力 | 说明 |
|---|---|---|
| Serial / Parallel | 弱 | 使用标记-整理(老年代)减少碎片 |
| CMS | 差 | 并发清理,易产生碎片 |
| G1 | 强 | 分区(Region),可混合回收 |
| ZGC / Shenandoah | 很强 | 几乎无停顿,碎片影响小 |
✅ 推荐
-XX:+UseG1GC
# 或
-XX:+UseZGC
CMS 只做 标记-清除,不做压缩:
Concurrent Mode FailureJDK 9 起 CMS 已废弃,JDK 14 移除
✅ 避免:
❌ 错误示例:
byte[] buf = new byte[10 * 1024 * 1024];
✅ 优化:
碎片问题在 堆太小 时更明显:
-Xms4g -Xmx4g
✅ 建议:
缓存是碎片主要来源:
Map<String, Object> cache = new HashMap<>();
✅ 优化:
WeakHashMapLRU + 过期策略大量小对象 → 分配频繁 → 碎片增加
✅ 优化:
ByteBuffer、Unsafe(高级)-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:gc.log
关注:
jstat -gcutil <pid>
✅ 最佳实践:
如果你愿意,可以告诉我:
我可以给你更具体的参数和方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。