JVM的面试真题有哪些

发布时间:2021-09-14 14:42:31 作者:柒染
来源:亿速云 阅读:154
# JVM的面试真题有哪些

## 目录
- [一、JVM内存模型](#一jvm内存模型)
- [二、垃圾回收机制](#二垃圾回收机制)
- [三、类加载机制](#三类加载机制)
- [四、性能调优实战](#四性能调优实战)
- [五、高级特性与原理](#五高级特性与原理)
- [六、综合场景题](#六综合场景题)
- [总结](#总结)

---

## 一、JVM内存模型

### 1.1 运行时数据区划分
**问题:请描述JVM运行时数据区的组成及其作用?**  
**参考答案:**  
- **程序计数器**:线程私有,记录当前线程执行的字节码行号指示器  
- **虚拟机栈**:线程私有,存储栈帧(局部变量表、操作数栈、动态链接、方法出口)  
- **本地方法栈**:为Native方法服务  
- **堆**:线程共享,存放对象实例和数组,GC主要区域  
- **方法区**:存储类信息、常量、静态变量(JDK8后由元空间实现)

**示例代码:**
```java
public class MemoryModel {
    private static final String CONSTANT = "常量"; // 方法区
    private int instanceVar; // 堆
    
    public void method() {
        int localVar = 1; // 虚拟机栈
        Object obj = new Object(); // obj引用在栈,对象在堆
    }
}

1.2 内存溢出场景

问题:什么情况下会导致OutOfMemoryError?如何定位?
参考答案:
- 堆溢出:对象过多且无法回收(-Xmx设置过小)
- 栈溢出:递归过深(-Xss调整栈大小)
- 方法区溢出:动态生成大量类(CGLib动态代理)
- 直接内存溢出:NIO的ByteBuffer.allocateDirect()

定位工具:

jmap -heap <pid>  # 堆内存分析
jstack <pid>      # 线程栈分析
jstat -gcutil <pid>  # GC统计

二、垃圾回收机制

2.1 GC算法对比

算法 原理 优缺点
标记-清除 标记存活对象后清除 产生内存碎片
标记-整理 标记后压缩内存 耗时但无碎片
复制算法 内存分为两块交替使用 空间利用率低但高效

2.2 垃圾收集器

问题:CMS和G1收集器的区别?
参考答案:
- CMS:基于标记-清除,追求最短停顿时间,但会产生碎片
- G1:分Region收集,可预测停顿模型,适合大堆(JDK9默认)

关键参数:

-XX:+UseConcMarkSweepGC  # 启用CMS
-XX:+UseG1GC             # 启用G1
-XX:MaxGCPauseMillis=200 # 目标停顿时间

三、类加载机制

3.1 加载过程

问题:描述类加载的双亲委派模型及其破坏场景
参考答案:
1. 流程
- 子加载器先委托父加载器
- 父加载器无法完成时子加载器尝试
2. 破坏场景
- SPI机制(如JDBC使用ServiceLoader
- OSGi动态模块化

示例:

// 自定义类加载器需重写findClass()
class CustomClassLoader extends ClassLoader {
    @Override
    protected Class<?> findClass(String name) {
        // 从自定义路径加载类
    }
}

四、性能调优实战

4.1 OOM排查案例

场景:服务频繁Full GC导致响应延迟
解决步骤:
1. jmap -dump:format=b,file=heap.hprof <pid> 导出堆快照
2. 使用MAT分析内存泄漏点(如ThreadLocal未清理)
3. 优化代码并调整JVM参数:

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/path/to/dump.hprof

五、高级特性与原理

5.1 逃逸分析

问题:JVM如何优化栈上分配?
参考答案:
- 通过逃逸分析确定对象作用域
- 未逃逸对象可在栈上分配(减少GC压力)
- 需开启-XX:+DoEscapeAnalysis


六、综合场景题

6.1 高并发系统设计

问题:如何设计一个避免Young GC频繁的系统?
解决方案:
1. 对象池化技术(如Apache Commons Pool)
2. 增大新生代比例(-Xmn
3. 选择适合的Survivor区比例(-XX:SurvivorRatio=8


总结

考察方向 高频考点
内存模型 各区域作用及溢出场景
GC机制 算法对比、收集器选择
类加载 双亲委派及热替换实现
调优实战 工具使用与参数优化

持续学习建议:
- 阅读《深入理解Java虚拟机》
- 分析开源项目JVM配置(如Kafka、Spark)
- 使用Arthas进行线上诊断 “`

注:实际9500字内容需扩展每个章节的详细案例分析、更多面试题变体及配图说明。以上为结构化框架,可根据需要补充具体技术细节和实战经验。

推荐阅读:
  1. Redis常见面试真题和答案
  2. 软件评测师真题分析

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

jvm

上一篇:MQTT协议和Modbus协议的比较

下一篇:常见的HTML5面试题有哪些

相关阅读

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

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