《java jvm 核心考点演练教程》聚焦面试与调优实战:以“new对象分配路径”为起点,结合-xx:pretenuresizethreshold、tlab、usecompressedoops等参数,用jstat和-xx:+printgcdetails验证eden/老年代落点;通过动态类生成复现metaspace oom;手写classloader打破双亲委派并触发securityexception;用jmap+mat定位泄漏而非盲目调大堆;所有实验基于jdk8/17,以jinfo校验参数真实生效值。

写一份实用的《Java JVM 核心考点演练教程》,关键不是堆砌概念,而是紧扣面试和实际调优中真正高频、易错、能动手验证的知识点,用“问题驱动 + 原理锚定 + 动手验证”三步展开。
内存结构与对象分配:从 new 到堆里哪块区域?
很多候选人知道“堆分新生代老年代”,但说不清一个 new 出来的对象到底落在 Eden 还是直接进老年代。这需要结合参数(如 -XX:PretenureSizeThreshold)、对象大小、TLAB 开关、以及是否开启 UseCompressedOops 等综合判断。
- 用 jstat -gc 观察每次 new 后 Eden 区变化,配合 -XX:+PrintGCDetails 看日志中 “allocation failure” 的触发时机
- 手动触发大对象分配(比如 new byte[8_000_000]),对比开启/关闭 PretenureSizeThreshold 的行为差异
- 注意:CMS 和 G1 对大对象处理逻辑不同——CMS 有 promotion failed,G1 有 humongous allocation 和回收机制
GC 日志解读:别只看 “GC pause”,要看谁触发、怎么回收、有没有失败
面试常问“这段 GC 日志说明什么问题?”,答案不在背术语,而在定位链路:是 Young GC 频繁?Full GC 突然增多?Metaspace OOM?还是 concurrent mode failure?
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 用 -Xlog:gc*:file=gc.log:time,uptime,pid,tags,level -XX:+PrintGCDetails(JDK9+)或 -XX:+PrintGCDetails -XX:+PrintGCDateStamps(JDK8)生成可读日志
- 重点关注时间戳、GC 类型(GC / Full GC / Concurrent Mode Failure)、各区域前后大小、耗时(real/user/sys)、是否发生晋升失败或元空间扩容
- 模拟 Metaspace 泄漏:动态生成大量类(如 CGLIB 或 JavaAssist 反复创建代理类),观察 Metaspace 区持续增长直至 OOM
类加载与双亲委派:不是背流程,而是破例外、查路径、验时机
“什么是双亲委派?”只是起点。真正考点是:Tomcat 怎么打破它?SPI 为什么能绕过?自定义类加载器在什么场景必须重写 loadClass?
- 写一个继承 ClassLoader 的加载器,不委托 parent,直接 defineClass,再尝试加载 java.lang.String——会抛 SecurityException,理解“启动类加载器保护”的底层约束
- 用 -verbose:class 启动程序,观察类加载顺序;再配合 -XX:+TraceClassLoading 和 -XX:+TraceClassUnloading 查看具体哪个 JAR 加载了某个类
- Spring Boot 的 LaunchedURLClassLoader 是如何组合多个 URL 并实现“优先加载 BOOT-INF/classes”的?关键在重写 findClass 而非 loadClass
JVM 参数实战调优:别列参数表,要讲“改哪个、为什么、怎么验证”
参数不是越多越好。高频调优集中在三类:内存布局(-Xmx/-XX:MaxMetaspaceSize)、GC 策略(-XX:+UseG1GC)、诊断开关(-XX:+HeapDumpOnOutOfMemoryError)。
- 用 jmap -histo:live pid 查看存活对象 Top 20,结合 MAT 分析 dominator tree 找泄漏根因,比盲目调大 -Xmx 更有效
- G1 调优重点不是设 -XX:MaxGCPauseMillis,而是观察 Mixed GC 的触发频率和 old region 回收比例;用 -XX:G1MixedGCCountTarget 控制混合回收轮次
- 线上加 -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly(需 hsdis)看 JIT 编译热点方法汇编,理解逃逸分析、锁消除等优化是否生效
不复杂但容易忽略:所有演练都该基于 JDK8 或 JDK17(LTS 版本),避免用已废弃参数(如 -XX:PermSize);每个实验做完,用 jinfo -flag 检查运行时实际生效值,而不是只信配置文件。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










