Java 内存管理实战的核心目标是:让程序跑得稳、快、不 OOM,并能在出问题时快速定位。下面按「原理 → 实战 → 工具 → 常见坑」系统讲解,偏工程落地。
┌─────────────────────────────┐
│ JVM Heap │ ← 对象实例(重点调优区)
│ ┌─────────┬─────────────┐ │
│ │ Young │ Old │ │
│ │ Eden S0 S1│ │ │
│ └─────────┴─────────────┘ │
├─────────────────────────────┤
│ Metaspace(方法区) │ ← 类信息、常量
├─────────────────────────────┤
│ Stack(线程栈) │ ← 局部变量、方法调用
├─────────────────────────────┤
│ Code Cache / Direct Memory │
└─────────────────────────────┘
实战结论:
static List<BigObject> cache = new ArrayList<>();
void add(Object o) {
cache.add(o); // 永远不会被回收
}
1️⃣ 控制生命周期
Map<Key, Value> cache = new WeakHashMap<>();
2️⃣ 明确释放
cache.clear();
3️⃣ 使用成熟缓存
Cache<String, User> cache = Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
✅ 经验法则:
生命周期 > 必要时间的对象 = 内存泄漏
-Xms4g
-Xmx4g
-Xmn2g
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=256m
✅ 避免 Heap 动态扩容造成的抖动
| 项目 | 建议 |
|---|---|
| 堆 | 不超过物理内存 70% |
| 年轻代 | 占堆 1/3 ~ 1/2 |
| 单线程栈 | -Xss256k~1m |
| GC | 场景 |
|---|---|
| G1 | ✅ 默认推荐(通用) |
| ZGC | 大堆、低延迟 |
| CMS | 老系统(不再推荐) |
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
Java heap space
Metaspace
Unable to create new native thread
Direct buffer memory
1️⃣ 保留现场
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/logs/heap.hprof
2️⃣ 用工具分析
3️⃣ 看什么?
✅ 经验结论:
OOM 90% 是“对象越来越多”,不是“对象太大”
for (int i = 0; i < 1000000; i++) {
String s = new String("abc");
}
String s = "abc"; // 常量池复用
List<String> list = new ArrayList<>(1000); // 指定容量
// 避免自动装箱
int sum = 0;
for (int i = 0; i < n; i++) sum += i;
✅ 目标:减少 Young GC
jstat -gc pid 1000
jmap -heap pid
jstack pid
| 坑 | 说明 |
|---|---|
| 静态集合 | 永不被回收 |
| ThreadLocal 未 remove | 内存泄漏 |
| 大对象频繁创建 | 老年代增长快 |
| 缓存无限增长 | OOM |
| 使用默认 JVM 参数 | 生产必炸 |
-Xms4g
-Xmx4g
-Xmn2g
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=256m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/logs/heap.hprof
Java 内存管理不是“不要管”,而是“管清楚对象什么时候活、什么时候死”。
如果你愿意,我可以:
只要告诉我:你用的是 JDK 几 + 应用类型 + 是否出过 OOM 就行。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。