Java 内存管理入门并不难,因为它有自动垃圾回收(GC),但你仍然需要理解内存模型、常见问题、工具与调优思路。下面我按「从零上手 → 实战 → 进阶」给你一个清晰路线。
一句话:
Java 帮你分配内存,也帮你回收不再使用的内存
但你得知道:
┌──────────────────────────────┐
│ JVM Memory Area │
├───────────────┬──────────────┤
│ Heap │ 栈 (Stack) │
│ (对象实例) │ (局部变量) │
├───────────────┴──────────────┤
│ Metaspace / 方法区 │
│ (类信息、常量) │
├──────────────────────────────┤
│ 程序计数器 / 本地方法栈 │
└──────────────────────────────┘
| 区域 | 存什么 | 是否 GC |
|---|---|---|
| Heap(堆) | new 出来的对象 | ✅ 是 |
| Stack(栈) | 方法调用、局部变量 | ❌ 自动 |
| Metaspace | 类信息 | ✅ |
| 常量池 | 字符串、常量 | ✅ |
90% 的 Java 内存问题都在 Heap
一句话:
没有被任何 GC Root 引用的对象
✅ 只要还能被这些引用到就不是垃圾
| 算法 | 特点 |
|---|---|
| 标记-清除 | 简单,有碎片 |
| 标记-整理 | 慢但无碎片 |
| 复制算法 | 快,适合新生代 |
| 分代收集 | ✅ 主流 |
Young Gen (新生代)
├ Eden
├ S0
└ S1
Old Gen (老年代)
流程:
List<byte[]> list = new ArrayList<>();
while (true) {
list.add(new byte[1024 * 1024]); // 1MB
}
运行后你会看到:
✅ 这是理解内存管理最好的方式
| 错误 | 原因 |
|---|---|
Java heap space |
堆内存不够 |
Metaspace |
类加载过多 |
GC overhead limit exceeded |
GC 效率极低 |
Unable to create new native thread |
线程过多 |
jps # 查看 Java 进程
jstat -gc pid # GC 情况
jmap -heap pid # 堆信息
jstack pid # 线程栈
| 工具 | 用途 |
|---|---|
| VisualVM | 入门首选 |
| JProfiler | 企业级 |
| MAT | 分析内存泄漏 |
| arthas | 线上排查神器 |
✅ 建议先装 VisualVM + MAT
✅ 早释放引用
list.clear();
list = null;
✅ 避免 static 集合
static List<User> users = new ArrayList<>(); // ❌
✅ 慎用大对象
✅ 集合初始化容量
new ArrayList<>(1024);
✅ 不要频繁 new 对象
✅ 用 try-with-resources
try (InputStream in = ...) {}
-Xms512m
-Xmx1024m
-XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError
✅ 会看、会改就够
✅ 入门
✅ 实战 4. OOM 分析 5. VisualVM / MAT 6. 常见内存泄漏
✅ 进阶 7. GC 日志分析 8. G1 / ZGC 9. JVM 调优
你可以直接说:
我可以按面试角度 / 实战角度 / 原理角度继续讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。