# JVM核心技术
# 一、运行时数据区(1-5)
- JVM运行时数据区有哪些?每个区域的作用是什么?
- 为什么Java线程栈会出现StackOverflowError?如何优化?
- 程序计数器的作用是什么?为什么它不会产生OOM?
- 方法区(元空间)和堆的区别是什么?为什么JDK 8用元空间替代永久代?
- 为什么String.intern()在JDK 6和JDK 7+行为不同?
# 二、对象创建与内存分配(6-15)
- Java对象是如何在堆上分配的?对象分配过程经历哪些阶段?
- 什么是TLAB(线程本地分配缓冲区)?它如何提升对象分配性能?
- 逃逸分析如何优化对象分配?为什么减少堆内存分配能提高性能?
- 什么是标量替换?如何减少对象分配?
- Java大对象(如1MB+数组)是如何分配的?为什么直接进入老年代?
- 对象的年龄判定与动态年龄判定
- 对象晋升老年代的条件有哪些?
- JVM如何优化对象的访问速度?什么是指针压缩?
- 堆外内存(DirectByteBuffer)是如何分配的?如何避免OOM?
- Java Finalize方法的作用是什么?为什么不推荐使用?
# 三、OOM与内存问题排查(16-25)
- 有哪些典型的Java OOM异常?如何分析和优化?
- 如何通过jmap、jstack、MAT进行OOM排查?
- 如何优化DirectByteBuffer造成的堆外内存OOM?
- Java线程创建过多会导致什么问题?如何避免?
- 如何通过JVM参数(-Xmx、-Xms)优化内存管理?
- 什么是Full GC?如何判断Full GC是否频繁发生?
- 如何分析和优化JVM内存泄漏?
- 如何使用jcmd、jstat监控JVM内存使用?
- Metaspace为什么会导致OOM?如何优化?
- 栈内存过小或过大会带来哪些影响?
# 四、GC机制与性能调优(26-40)
- Java垃圾回收如何判断对象是否可回收?
- 强/软/弱/虚引用如何影响GC?分别适用于哪些场景?
- 常见GC算法有哪些?标记-清除、复制、标记-整理有何区别?
- 为什么Java采用分代回收策略?每代GC的触发条件是什么?
- CMS和G1 GC的区别?G1为什么能避免STW?
- Full GC发生的原因是什么?如何避免频繁Full GC?
- 如何通过GC日志分析GC问题?-XX:+PrintGCDetails如何使用?
- 如何优化G1 GC?如何调整-XX:InitiatingHeapOccupancyPercent?
- Shenandoah GC与ZGC的区别?各自适用于哪些场景?
- 如何使用-XX:+UseStringDeduplication进行String池优化?
- GC日志如何分析Young GC和Old GC?
- 如何减少GC影响,提升高并发应用的吞吐量?
- GC Root主要包含哪些对象?
- Java 21新增的ZGC有什么特点?如何与G1进行对比?
# 五、低延迟GC方案(41-45)
# 六、类加载与字节码执行(46-60)
- JVM的类加载过程是什么?有哪些关键步骤?
- 双亲委派模型如何防止类冲突?哪些场景会破坏双亲委派?
- JEP 376(类加载改进)如何优化Java 16+的类加载机制?
- 什么是类卸载?为什么JDK 8的metaspace可能导致OOM?
- JIT编译器如何优化Java代码?解释执行和JIT编译的区别?
- 逃逸分析如何影响JIT编译优化?
- 如何使用ASM修改Java字节码?字节码增强的应用场景?
- 为什么synchronized使用monitorenter和monitorexit指令?
- JVM诊断工具jcmd、jstack、jmap的应用场景?
# 重点内容
- JVM内存模型与运行时数据区
- 对象创建、分配与回收机制
- GC算法原理与垃圾收集器特点
- 内存问题分析与性能调优方法
- 类加载机制与字节码执行原理
- JIT即时编译与优化技术