Java 堆内存调优是 JVM 性能优化的核心部分,目标是在避免 OOM(OutOfMemoryError)和减少 GC 停顿之间取得平衡。下面从原理 → 参数 → 调优步骤 → 实战建议四个层面说明。
堆内存结构(以 HotSpot 为例):
堆
├── 年轻代(Young)
│ ├── Eden
│ ├── Survivor From
│ └── Survivor To
└── 老年代(Old)
-Xms512m # 初始堆大小
-Xmx2g # 最大堆大小(建议与 -Xms 一致,避免动态扩容)
✅ 推荐:
-Xms2g -Xmx2g
-Xmn512m # 年轻代大小
-XX:NewRatio=2 # 老年代:年轻代 = 2:1
-XX:SurvivorRatio=8
示例含义:
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/path/gc.log
JDK 9+:
-Xlog:gc*:file=gc.log:time
工具:
jstat -gcutil pid 1000关注指标:
常见问题:
-Xmn1g
-XX:SurvivorRatio=6
-Xmx4g
-XX:MaxTenuringThreshold=15
-XX:PretenureSizeThreshold=1m
| 场景 | 建议 |
|---|---|
| Web 服务 | 年轻代大一些 |
| 批处理 | 堆大、GC 少 |
| 高并发 | 低延迟 GC(G1 / ZGC) |
| 缓存型 | 老年代大 |
# JDK 8
-XX:+UseParallelGC
-XX:+UseConcMarkSweepGC
# JDK 11+
-XX:+UseG1GC
-XX:+UseZGC
✅ 新项目推荐:
-XX:+UseG1GC
❌ 只调 -Xmx 不调年轻代
❌ 堆过大导致 GC 停顿变长
❌ 忽略内存泄漏(持续增长)
❌ 生产环境不开 GC 日志
堆调优 = 合理堆大小 + 合理代比例 + 正确 GC + 数据驱动调整
如果你愿意,可以告诉我:
我可以帮你做针对性调优方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。