Java 内存管理主要依赖 JVM 的自动垃圾回收(GC),但并不意味着开发者可以完全无视内存使用。合理的编码和设计可以显著减少内存压力、提升性能,并降低 OOM(Out Of Memory)风险。
下面从 实用技巧 + 设计原则 + 工具 三个层面总结。
虽然 Java 有 GC,但对象被引用就不会被回收。
// 不推荐
List<BigObject> list = new ArrayList<>();
list.add(bigObj);
// 如果不再使用,记得清空
list.clear();
✅ 原则:不再用的对象,显式断开引用
对象越多,GC 压力越大。
// 不推荐
String s = new String("abc");
// 推荐
String s = "abc";
常见优化点:
StringBuilder不同集合内存占用差异很大:
| 场景 | 推荐 |
|---|---|
| 固定大小 | 数组 |
| 只存数据 | ArrayList |
| 频繁增删 | LinkedList |
| 去重 | HashSet |
| 键值对 | HashMap(避免过大 load factor) |
✅ 避免:
HashMap 初始容量过小(频繁扩容)// 不推荐
Integer i = 1000;
// 推荐
int i = 1000;
原因:
List<Integer> vs int[])"abc" + "def" // 编译期优化
new String("abc") // 会创建新对象
✅ 建议:
intern() 需谨慎(可能占用 Perm/Metaspace)常见内存泄漏原因:
static Map<String, Object> cache = new HashMap<>();
✅ 改进:
WeakHashMapThreadLocal<BigObject> local = new ThreadLocal<>();
注意:
大对象(如大数组、大集合):
✅ 技巧:
常见参数(示例):
-Xms2g -Xmx2g
-XX:+UseG1GC
-XX:MaxMetaspaceSize=256m
✅ 建议:
| 工具 | 用途 |
|---|---|
| jps | 查看 Java 进程 |
| jstat | GC 情况 |
| jmap | 内存快照 |
| jhat / MAT | 分析内存 |
| VisualVM | 可视化监控 |
| Arthas | 在线诊断 |
| 问题 | 原因 | 对策 |
|---|---|---|
| OOM: Java heap space | 对象过多 | 优化数据结构、分页 |
| OOM: Metaspace | 类加载过多 | 限制 Metaspace |
| OOM: Direct buffer | 堆外内存 | 控制 DirectMemory |
| 内存缓慢增长 | 内存泄漏 | dump 分析 |
Java 内存管理的核心不是“手动回收”,而是:减少对象数量、缩短对象生命周期、避免无效引用。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。