做好 Java 内存管理的核心目标是:减少内存泄漏、降低 GC 压力、提高系统稳定性和性能。下面从原理、实践、工具、常见误区几个层面系统讲解。
✅ Java 内存管理的重点在 堆 + GC
常见 GC:
static Map<String, Object> cache = new HashMap<>();
✅ 改进方式:
Map<String, Object> cache = new WeakHashMap<>();
❌ 不推荐:
public void process() {
List<User> list = new ArrayList<>();
// 逻辑结束,但仍被引用
}
✅ 推荐:
| 场景 | 建议 |
|---|---|
| 大量临时对象 | 避免 List / Map |
| 缓存 | 使用 LRU、WeakReference |
| 大量字符串 | 避免频繁拼接 |
❌ 错误示例:
String s = "";
for (int i = 0; i < 10000; i++) {
s += i;
}
✅ 正确做法:
StringBuilder sb = new StringBuilder();
List<String> list = new ArrayList<>(1024);
clear() 或置 nulllist.clear();
list = null;
❌ 无限缓存:
Map<Long, Object> cache = new HashMap<>();
✅ 正确方式:
LRUCacheCaffeine / Guava Cachetry (InputStream in = new FileInputStream(file)) {
// 自动关闭
}
❌ 常见错误:
ThreadLocal<Object> tl = new ThreadLocal<>();
tl.set(obj);
// 线程池复用,未 remove
✅ 正确做法:
try {
tl.set(obj);
} finally {
tl.remove();
}
-Xms4g -Xmx4g
✅ 生产环境建议 堆初始 = 最大
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/logs/heapdump.hprof
jps:查看 Java 进程jstat -gc pid:GC 情况jmap -histo pid:对象统计jstack pid:线程分析| 问题 | 原因 | 解决方案 |
|---|---|---|
| OOM: Java heap space | 内存分配不足 | 增大堆、减少对象 |
| OOM: Metaspace | 类加载过多 | 控制动态代理、反射 |
| Full GC 频繁 | 老年代对象过多 | 减少长生命周期对象 |
| CPU 飙高 | GC 频繁 | 优化对象创建 |
Java 内存管理 = 少创建 + 快释放 + 控制生命周期 + 合理 JVM 参数 + 及时监控
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。