《Java开发者面试百宝书》和《JVM实战》最对口:前者问答式覆盖类加载、内存模型、GC算法等高频考点;后者侧重jstat/jmap/jstack实操分析。重点理解运行时数据区分工、GC Roots与可达性分析、ZGC/Shenandoah并发特性及元空间溢出成因。

直接看《Java开发者面试百宝书》和《JVM实战》这两本最对口。前者按问答形式组织,覆盖类加载、内存模型、GC算法、调优命令等高频问题,适合快速查漏补缺;后者侧重实操,带大量Linux下jstat/jmap/jstack分析案例,能帮你把理论落到生产环境。
重点看懂运行时数据区的分工逻辑
- 堆和方法区(元空间)是所有线程共享的,对象实例和类元信息放这儿
- 虚拟机栈、本地方法栈、程序计数器是线程私有的,每个线程一份,互不干扰
- 栈帧里的局部变量表存参数和局部变量,操作数栈做运算中转,帧数据区记返回地址
GC相关问题别只背名词
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- CMS已废弃,G1是JDK9默认,ZGC/Shenandoah主打低延迟,但需JDK11+
- 判断对象是否可回收,主流用可达性分析(不是引用计数),GC Roots包括虚拟机栈变量、静态字段、本地方法栈引用等
- Full GC不一定等于Stop-The-World,ZGC和Shenandoah能做到并发标记与清理
调优建议从真实指标出发
立即学习“Java免费学习笔记(深入)”;
- 先用
jstat -gc <pid></pid>看GC频率和耗时,再结合jmap -histo查大对象,最后用jstack抓线程阻塞点 - 元空间溢出常见原因是动态生成类(如Spring CGLIB代理、JSON序列化框架反复生成类),不是代码写错,而是类加载没释放
-
-Xms和-Xmx设成一样可避免堆扩容抖动,-XX:MaxMetaspaceSize必须设,否则元空间吃光系统内存
不复杂但容易忽略。

















