# JVM核心技术

# 一、运行时数据区(1-5)

  1. JVM运行时数据区有哪些?每个区域的作用是什么?
  2. 为什么Java线程栈会出现StackOverflowError?如何优化?
  3. 程序计数器的作用是什么?为什么它不会产生OOM?
  4. 方法区(元空间)和堆的区别是什么?为什么JDK 8用元空间替代永久代?
  5. 为什么String.intern()在JDK 6和JDK 7+行为不同?

# 二、对象创建与内存分配(6-15)

  1. Java对象是如何在堆上分配的?对象分配过程经历哪些阶段?
  2. 什么是TLAB(线程本地分配缓冲区)?它如何提升对象分配性能?
  3. 逃逸分析如何优化对象分配?为什么减少堆内存分配能提高性能?
  4. 什么是标量替换?如何减少对象分配?
  5. Java大对象(如1MB+数组)是如何分配的?为什么直接进入老年代?
  6. 对象的年龄判定与动态年龄判定
  7. 对象晋升老年代的条件有哪些?
  8. JVM如何优化对象的访问速度?什么是指针压缩?
  9. 堆外内存(DirectByteBuffer)是如何分配的?如何避免OOM?
  10. Java Finalize方法的作用是什么?为什么不推荐使用?

# 三、OOM与内存问题排查(16-25)

  1. 有哪些典型的Java OOM异常?如何分析和优化?
  2. 如何通过jmap、jstack、MAT进行OOM排查?
  3. 如何优化DirectByteBuffer造成的堆外内存OOM?
  4. Java线程创建过多会导致什么问题?如何避免?
  5. 如何通过JVM参数(-Xmx、-Xms)优化内存管理?
  6. 什么是Full GC?如何判断Full GC是否频繁发生?
  7. 如何分析和优化JVM内存泄漏?
  8. 如何使用jcmd、jstat监控JVM内存使用?
  9. Metaspace为什么会导致OOM?如何优化?
  10. 栈内存过小或过大会带来哪些影响?

# 四、GC机制与性能调优(26-40)

  1. Java垃圾回收如何判断对象是否可回收?
  2. 强/软/弱/虚引用如何影响GC?分别适用于哪些场景?
  3. 常见GC算法有哪些?标记-清除、复制、标记-整理有何区别?
  4. 为什么Java采用分代回收策略?每代GC的触发条件是什么?
  5. CMS和G1 GC的区别?G1为什么能避免STW?
  6. Full GC发生的原因是什么?如何避免频繁Full GC?
  7. 如何通过GC日志分析GC问题?-XX:+PrintGCDetails如何使用?
  8. 如何优化G1 GC?如何调整-XX:InitiatingHeapOccupancyPercent?
  9. Shenandoah GC与ZGC的区别?各自适用于哪些场景?
  10. 如何使用-XX:+UseStringDeduplication进行String池优化?
  11. GC日志如何分析Young GC和Old GC?
  12. 如何减少GC影响,提升高并发应用的吞吐量?
  13. GC Root主要包含哪些对象?
  14. Java 21新增的ZGC有什么特点?如何与G1进行对比?

# 五、低延迟GC方案(41-45)

  1. 为什么GC可能导致应用长时间停顿?如何降低STW时间?
  2. ZGC如何做到低延迟?它适用于哪些业务场景?

# 六、类加载与字节码执行(46-60)

  1. JVM的类加载过程是什么?有哪些关键步骤?
  2. 双亲委派模型如何防止类冲突?哪些场景会破坏双亲委派?
  3. JEP 376(类加载改进)如何优化Java 16+的类加载机制?
  4. 什么是类卸载?为什么JDK 8的metaspace可能导致OOM?
  5. JIT编译器如何优化Java代码?解释执行和JIT编译的区别?
  6. 逃逸分析如何影响JIT编译优化?
  7. 如何使用ASM修改Java字节码?字节码增强的应用场景?
  8. 为什么synchronized使用monitorenter和monitorexit指令?
  9. JVM诊断工具jcmd、jstack、jmap的应用场景?

# 重点内容

  1. JVM内存模型与运行时数据区
  2. 对象创建、分配与回收机制
  3. GC算法原理与垃圾收集器特点
  4. 内存问题分析与性能调优方法
  5. 类加载机制与字节码执行原理
  6. JIT即时编译与优化技术