2021最新版JVM虚拟机面试题有哪些

发布时间:2021-10-13 10:26:51 作者:iii
来源:亿速云 阅读:164
# 2021最新版JVM虚拟机面试题有哪些

## 一、JVM内存模型与结构

### 1.1 运行时数据区划分
**问题:** JVM运行时数据区包含哪些核心部分?  
**答案:**  
- **程序计数器**:线程私有,记录当前线程执行的字节码行号  
- **虚拟机栈**:线程私有,存储栈帧(局部变量表、操作数栈等)  
- **本地方法栈**:为Native方法服务  
- **堆**:线程共享,存放对象实例  
- **方法区**:存储类信息、常量、静态变量(JDK8后由元空间实现)

**扩展:**  
- JDK8移除永久代改用元空间(Metaspace)的原因:避免OOM,使用本地内存

### 1.2 内存溢出场景
**问题:** 列举常见的OOM异常及触发条件  
**答案:**  
- `OutOfMemoryError: Java heap space`:堆内存不足  
- `OutOfMemoryError: PermGen space`(JDK7及之前):类加载过多  
- `OutOfMemoryError: Metaspace`:元空间溢出  
- `OutOfMemoryError: Unable to create new native thread`:线程数超过限制

## 二、垃圾回收机制

### 2.1 GC算法分类
**问题:** JVM有哪些垃圾回收算法?各自特点是什么?  
**答案:**  
| 算法 | 原理 | 优缺点 |
|------|------|--------|
| 标记-清除 | 标记存活对象后清除未标记对象 | 简单但产生内存碎片 |
| 标记-整理 | 标记后整理存活对象到内存一端 | 避免碎片但耗时 |
| 复制算法 | 将存活对象复制到另一块内存 | 高效无碎片但浪费空间 |
| 分代收集 | 根据对象生命周期分区管理 | 综合性能最优(新生代+老年代) |

### 2.2 垃圾收集器对比
**问题:** CMS和G1收集器的核心区别是什么?  
**答案:**  
- **CMS(Concurrent Mark-Sweep)**  
  - 目标:最小化停顿时间  
  - 阶段:初始标记→并发标记→重新标记→并发清除  
  - 缺点:内存碎片、并发模式失败风险  

- **G1(Garbage-First)**  
  - 特点:分区化内存布局,可预测停顿模型  
  - 阶段:年轻代GC→混合GC→Full GC(后备方案)  
  - 优势:适合大内存(>4G),JDK9默认收集器  

## 三、类加载机制

### 3.1 类加载过程
**问题:** 描述类加载的五个阶段  
**答案:**  
1. **加载**:查找并加载字节码  
2. **验证**:检查文件格式、元数据等  
3. **准备**:为静态变量分配内存(默认值)  
4. **解析**:将符号引用转为直接引用  
5. **初始化**:执行静态代码块和赋值  

**注意:** 双亲委派模型在加载阶段发挥作用

### 3.2 双亲委派模型
**问题:** 如何破坏双亲委派机制?举例说明  
**答案:**  
- **破坏方式**:  
  1. 重写ClassLoader的loadClass()方法  
  2. 使用线程上下文类加载器(如JDBC驱动加载)  
  3. OSGi模块化热部署  

- **实际案例**:  
  Tomcat为每个Web应用单独创建WebAppClassLoader

## 四、性能调优实战

### 4.1 常用JVM参数
**问题:** 列举5个关键JVM调优参数  
**答案:**  
```bash
-Xms2g  # 初始堆大小
-Xmx2g  # 最大堆大小
-XX:NewRatio=2  # 老年代/新生代比例
-XX:+HeapDumpOnOutOfMemoryError  # OOM时生成dump文件
-XX:MaxGCPauseMillis=200  # G1最大停顿时间目标

4.2 内存泄漏排查

问题: 如何定位Java内存泄漏?
解决方案:
1. 工具诊断
- jmap -histo:live <pid> 查看对象分布
- jvisualvm 分析堆转储文件
- Eclipse MAT 分析对象引用链

  1. 代码检查点
    • 未关闭的数据库连接
    • 静态集合长期持有对象
    • 监听器未注销

五、高级特性与面试陷阱

5.1 逃逸分析优化

问题: JVM如何通过逃逸分析优化代码?
答案:
- 栈上分配:未逃逸对象直接在栈帧分配
- 标量替换:将对象拆解为基本类型存储
- 同步消除:去除线程安全对象的锁

注意: 需配合-XX:+DoEscapeAnalysis启用

5.2 常见面试陷阱题

例题:

String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2);  // false

考点:
- 字符串常量池与堆内存的区别
- intern()方法的作用

六、最新特性(2021更新)

6.1 JDK16新特性

6.2 趋势性问题

问题: 云原生时代JVM的挑战?
参考答案:
- 容器化环境的内存限制
- GraalVM原生镜像的兴起
- Serverless场景的冷启动问题


附录:高频问题速查表

分类 高频问题 出现概率
内存模型 对象创建过程 ★★★★★
GC CMS的并发模式失败处理 ★★★★
类加载 如何自定义ClassLoader ★★★
调优 Young GC频繁的原因 ★★★★

注:本文基于JDK8~16版本整理,实际面试需结合候选人经验调整问题深度。 “`

这篇文章通过Markdown格式系统性地组织了JVM面试知识点,包含: 1. 结构化分层展示核心内容 2. 表格对比关键概念差异 3. 代码片段示例说明 4. 最新版本特性补充 5. 实战问题排查方法论 6. 面试技巧提示

可根据具体需要调整各部分深度,建议配合实际案例进行扩展说明。

推荐阅读:
  1. 2021有哪些最新版的Dubbo面试题
  2. 2021有哪些最新版的Elasticsearch面试题

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jvm

上一篇:到底什么是阻塞Blocking

下一篇:SQL Server2008数据库导入导出兼容性的处理方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》