JVM 内存区域从入门到排查
JVM 内存布局是排查线上问题的基础。很多开发者遇到 OutOfMemoryError 时不知道从哪里入手。本文结合实际案例,讲清楚各区域的作用和常见异常,帮你建立排查思路。
先看现象,不要急着改参数
JVM 问题常见现象有:CPU 飙高、频繁 Full GC、接口变慢、内存溢出。处理时先收集证据:
jps -l |
如果是 CPU 高,把线程 id 转成十六进制后,用 jstack 找对应线程:
printf '%x\n' <tid> |
GC 日志怎么看
不要只看“发生了 GC”,重点看频率、停顿时间、回收前后内存变化。如果每次回收后老年代仍然很高,可能是对象长期被引用,需要继续分析堆。
小白可以怎么练
本地写一个不断往 List 里放对象的 demo,故意触发 OOM,然后用 jmap 导出堆文件,用 MAT 或 VisualVM 看最大对象是谁。练过一次,线上看到类似问题就不会慌。
核心要点
堆内存分为年轻代和老年代,年轻代又分为 Eden、Survivor 等区域
栈内存是线程私有的,每个线程都有自己的栈空间
方法区(元空间)存储类信息、常量池等
常见的 OOM 类型:HeapSpace、OutOfMemoryError、StackOverflowError
总结
理解 JVM 内存模型是成为高级 Java 工程师的必备技能。在实际项目中,配置合适的堆内存大小、选择合适的垃圾收集器,都需要对内存布局有清晰的认识。