【面试八股文】JVM经典面试

JVM 八股文重点整理

 一、JVM 内存结构

 

1. 程序计数器:

   - 线程私有,记录当前线程执行的字节码行号指示器

   - 唯一不会出现 OOM 的区域

 

2. 虚拟机栈:

   - 线程私有,生命周期与线程相同

   - 存储栈帧(局部变量表、操作数栈、动态链接、方法出口)

   - StackOverflowError(栈深度超过限制)和 OOM(无法扩展时)

 

3. 本地方法栈:

   - 为 Native 方法服务

 

4. 堆:

   - 线程共享,存放对象实例

   - 新生代(Eden、Survivor0、Survivor1)和老年代

   - 主要 GC 区域,会出现 OOM

 

5. 方法区:

   - 线程共享,存储类信息、常量、静态变量等

   - JDK8 后由元空间实现,使用本地内存

 

 二、垃圾回收

 

1. 判断对象是否存活:

   - 引用计数法(无法解决循环引用)

   - 可达性分析(GC Roots 包括虚拟机栈、本地方法栈、静态属性、常量等引用的对象)

 

2. 垃圾回收算法:

   - 标记-清除:产生碎片

   - 标记-整理:适合老年代

   - 复制算法:适合新生代

   - 分代收集:新生代用复制,老年代用标记-清除/整理

 

3. 垃圾收集器:

   - Serial:单线程,新生代

   - ParNew:Serial 的多线程版本

   - Parallel Scavenge:吞吐量优先

   - CMS:低延迟,标记-清除,并发收集

   - G1:区域化分代,可预测停顿

   - ZGC:JDK11+,低延迟,大堆

 

三、类加载机制

 

1. 加载过程:

   - 加载 → 验证 → 准备 → 解析 → 初始化 → 使用 → 卸载

 

2. 类加载器:

   - 启动类加载器(Bootstrap)

   - 扩展类加载器(Extension)

   - 应用程序类加载器(Application)

   - 自定义类加载器

 

3. 双亲委派模型:

   - 子加载器先委托父加载器加载

   - 避免重复加载,保证核心类安全

 

4. 打破双亲委派:

   - SPI 服务发现(如 JDBC)

   - OSGi 等模块化技术

 

## 四、JVM 调优

 

1. 常用参数:

   - -Xms/-Xmx:初始/最大堆大小

   - -Xmn:新生代大小

   - -XX:SurvivorRatio:Eden 和 Survivor 比例

   - -XX:MaxTenuringThreshold:晋升老年代年龄

 

2. 调优工具:

   - jps:查看 Java 进程

   - jstat:监控统计信息

   - jmap:内存分析

   - jstack:线程分析

   - VisualVM:图形化分析

 

3. 常见问题:

   - OOM 排查:堆 dump 分析

   - CPU 过高:线程栈分析

   - 死锁:jstack 检测

 

五、执行引擎

 

1. 解释执行与编译执行:

   - 解释器:快速启动

   - JIT 编译器(C1/C2):热点代码优化

 

2. 逃逸分析:

   - 栈上分配

   - 同步消除

   - 标量替换

 

3. 方法内联:

   - 减少方法调用开销

   - 重要的优化手段

 

六、内存模型(JMM)

 

1. 主内存与工作内存:

   - 线程私有工作内存

   - 共享主内存

 

2. happens-before 原则:

   - 程序顺序规则

   - 锁规则

   - volatile 规则

   - 传递性等

 

3. volatile:

   - 可见性

   - 禁止指令重排序

   - 不保证原子性

 

以上是 JVM 相关的核心知识点整理,适合面试准备和快速复习。

你可能感兴趣的:(java,学习方法,深度学习,开发语言,面试)