1、 2025年jvm面试题及答案 一、单项选择题(总共10题,每题2分) 1. 以下关于JVM内存区域的说法,正确的是( ) A. 程序计数器是线程私有的 B. 虚拟机栈是线程私有的 C. 本地方法栈是线程私有的 D. 以上都是 答案:D 解析:程序计数器、虚拟机栈、本地方法栈都是线程私有的,每个线程都有自己独立的这些区域。 2. 以下哪种垃圾收集器是单线程的( ) A. Serial B. ParNew C. Parallel Scavenge D. CMS 答案:A 解析:Serial收集器是最基本、历史最悠久的垃圾收集器,它是单线程的,进行垃圾
2、收集时会暂停所有的用户线程。 3. 当一个对象的引用计数为0时,它会被( ) A. 标记清除 B. 标记整理 C. 复制算法 D. 回收 答案:D 解析:引用计数法中,当对象的引用计数为0时,就意味着该对象不再被任何地方引用,会被回收。 4. 以下哪个是Java堆的主要作用( ) A. 存放对象实例 B. 执行程序代码 C. 存储线程上下文 D. 存放编译后的字节码 答案:A 解析:Java堆是Java虚拟机所管理的内存中最大的一块,主要用于存放对象实例。 5. 方法区在JDK 8中被替换为( ) A. 永久代 B. 元空间 C. 堆空间
3、 D. 栈空间 答案:B 解析:JDK 8中,方法区被元空间取代,元空间使用的是本地内存。 6. 以下哪种情况会导致对象进入老年代( ) A. 经过多次Minor GC仍然存活 B. 直接分配大对象 C. 以上都是 D. 都不是 答案:C 解析:对象在新生代经历多次Minor GC仍然存活会晋升到老年代,直接分配大对象也可能直接进入老年代。 7. JVM的类加载器不包括以下哪种( ) A. 启动类加载器 B. 扩展类加载器 C. 应用类加载器 D. 用户自定义类加载器 答案:D 解析:JVM的类加载器包括启动类加载器、扩展类加载器、应用类加载器,用户
4、自定义类加载器是可以由开发者自己定义的。 8. 以下关于HotSpot虚拟机的说法,错误的是( ) A. 它是Java语言的默认虚拟机 B. 采用解释器与编译器并存的架构 C. 不支持动态编译 D. 有自己的即时编译器 答案:C 解析:HotSpot虚拟机采用解释器与编译器并存的架构,支持动态编译。 9. 以下哪种垃圾收集算法适用于老年代( ) A. 标记清除算法 B. 标记整理算法 C. 复制算法 D. 以上都不适用于老年代 答案:B 解析:标记整理算法适用于老年代,它在标记出存活对象后,将所有存活对象向一端移动,然后直接清理掉端边界以外的内存。
5、 10. 当一个Java类被加载时,以下哪个步骤是最后执行的( ) A. 加载 B. 验证 C. 解析 D. 初始化 答案:D 解析:类加载的过程包括加载、验证、解析、初始化,初始化是最后一步。 二、多项选择题(总共10题,每题2分) 1. 以下哪些属于JVM的垃圾收集器( ) A. Serial B. Parallel Scavenge C. CMS D. G1 答案:ABCD 解析:Serial、Parallel Scavenge、CMS、G1都是JVM的垃圾收集器。 2. 以下关于Java堆内存分配的说法,正确的有( ) A. 对象优先在E
6、den区分配 B. 大对象直接进入老年代 C. 长期存活的对象进入老年代 D. 当Eden区满时会触发Minor GC 答案:ABCD 解析:对象优先在Eden区分配,大对象直接进入老年代,长期存活的对象进入老年代,当Eden区满时会触发Minor GC。 3. 以下哪些是JVM内存区域( ) A. 程序计数器 B. 虚拟机栈 C. 本地方法栈 D. 堆 答案:ABCD 解析:程序计数器、虚拟机栈、本地方法栈、堆都是JVM内存区域。 4. 以下关于类加载机制的说法,正确的有( ) A. 双亲委派模型保证了类的加载顺序 B. 类加载过程包括加载、验证、解
7、析、初始化 C. 自定义类加载器可以打破双亲委派模型 D. 启动类加载器负责加载核心类库 答案:ABCD 解析:双亲委派模型保证了类的加载顺序,类加载过程包括加载、验证、解析、初始化,自定义类加载器可以打破双亲委派模型,启动类加载器负责加载核心类库。 5. 以下哪些情况会触发Full GC( ) A. 老年代空间不足 B. 永久代空间不足(JDK 8之前) C. 元空间空间不足(JDK 8之后) D. 新生代空间不足 答案:ABC 解析:老年代空间不足、永久代空间不足(JDK 8之前)、元空间空间不足(JDK 8之后)会触发Full GC,新生代空间不足触发Mino
8、r GC。 6. 以下关于JVM即时编译器的说法,正确的有( ) A. 可以将字节码编译为本地机器码 B. 提高程序执行效率 C. 有多种即时编译器实现 D. 即时编译会消耗一定的系统资源 答案:ABCD 解析:JVM即时编译器可以将字节码编译为本地机器码,提高程序执行效率,有多种即时编译器实现,即时编译会消耗一定的系统资源。 7. 以下哪些是Java对象头的组成部分( ) A. 哈希码 B. GC分代年龄 C. 锁状态标志 D. 指向对象类元数据的指针 答案:ABCD 解析:Java对象头包括哈希码、GC分代年龄、锁状态标志、指向对象类元数据的指针等。
9、 8. 以下关于垃圾收集的说法,正确的有( ) A. 可以回收不再使用的对象 B. 提高内存利用率 C. 不同的垃圾收集器有不同的特点 D. 垃圾收集会影响程序性能 答案:ABCD 解析:垃圾收集可以回收不再使用的对象,提高内存利用率,不同的垃圾收集器有不同的特点,垃圾收集会影响程序性能。 9. 以下哪些属于JVM的优化措施( ) A. 即时编译 B. 逃逸分析 C. 锁粗化 D. 锁消除 答案:ABCD 解析:即时编译、逃逸分析、锁粗化、锁消除都是JVM的优化措施。 10. 以下关于JVM类加载器的说法,正确的有( ) A. 启动类加载器加载
10、的类是最基础的类 B. 扩展类加载器加载扩展目录下的类 C. 应用类加载器加载应用程序的类 D. 类加载器之间存在父子关系 答案:ABCD 解析:启动类加载器加载的类是最基础的类,扩展类加载器加载扩展目录下的类,应用类加载器加载应用程序的类,类加载器之间存在父子关系。 三、填空题(总共4题,每题5分) 1. JVM的内存区域主要包括程序计数器、虚拟机栈、本地方法栈、______和______。 答案:堆、方法区(JDK 8之前为永久代,JDK 8之后为元空间) 解析:JVM内存区域主要包括程序计数器、虚拟机栈、本地方法栈、堆和方法区(JDK 8之前为永久代,JDK 8之
11、后为元空间)。 2. 垃圾收集算法主要有标记清除算法、标记整理算法、______算法和______算法。 答案:复制算法、分代收集算法 解析:垃圾收集算法主要有标记清除算法、标记整理算法、复制算法和分代收集算法。 3. 类加载的过程包括加载、______、______、初始化。 答案:验证、解析 解析:类加载的过程包括加载、验证、解析、初始化。 4. JVM的即时编译器有______和______等。 答案:C1、C2 解析:JVM的即时编译器有C1和C2等。 四、判断题(总共10题,每题2分) 1. JVM的所有内存区域都是线程私有的。( ) 答案
12、错误 解析:程序计数器、虚拟机栈、本地方法栈是线程私有的,而堆和方法区是共享的。 2. 垃圾收集器在进行垃圾回收时不会影响程序的运行。( ) 答案:错误 解析:垃圾收集器在进行垃圾回收时会暂停所有用户线程,从而影响程序运行。 3. 方法区主要用于存放编译后的字节码。( ) 答案:错误 解析:方法区主要用于存放已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等。 4. 类加载器只能加载.class文件。( ) 答案:错误 解析:类加载器可以加载多种形式的字节码,不仅仅是.class文件。 5. 新生代对象经过多次Minor GC后会
13、进入老年代。( ) 答案:正确 解析:新生代对象经过多次Minor GC仍然存活会晋升到老年代。 6. 标记清除算法不会产生内存碎片。( ) 答案:错误 解析:标记清除算法会产生内存碎片。 7. JVM的即时编译器可以将所有字节码都编译为本地机器码。( ) 答案:错误 解析:即时编译器会根据情况选择合适的字节码进行编译,不会将所有字节码都编译为本地机器码。 8. 应用类加载器是Java类加载器层次结构中的顶层类加载器。( ) 答案:错误 解析:启动类加载器是Java类加载器层次结构中的顶层类加载器。 9. 当一个对象的所有引用都被释放后,它会立即
14、被垃圾回收。( ) 答案:错误 解析:当一个对象的所有引用都被释放后,它会被列入垃圾回收队列,但不一定会立即被回收。 10. 不同的垃圾收集器适用于不同的应用场景。( ) 答案:正确 解析:不同的垃圾收集器有不同的特点,适用于不同的应用场景。 五、简答题(总共4题,每题5分) 1. 简述JVM的内存区域划分及各区域的作用。 答案:JVM内存区域主要包括程序计数器、虚拟机栈、本地方法栈、堆和方法区。程序计数器记录当前线程执行的字节码行号;虚拟机栈存放局部变量表、操作数栈等;本地方法栈用于执行本地方法;堆存放对象实例;方法区存放类信息、常量等。 解析:程序计数器记录
15、当前线程执行的字节码行号,保证线程切换后能恢复正确执行位置。虚拟机栈为每个方法执行创建栈帧,存放局部变量和操作数栈等。本地方法栈用于执行本地方法。堆是对象实例的存放地。方法区存储类的相关信息等,为类的加载、运行提供支持。 2. 简述垃圾收集的过程及主要算法。 答案:垃圾收集过程包括标记出不再使用的对象,然后进行回收。主要算法有标记清除算法,先标记再清除;标记整理算法,标记后整理内存;复制算法,将内存分为两块,复制存活对象;分代收集算法,根据对象年龄分不同区域采用不同算法。 解析:首先通过可达性分析等方式标记出不再使用的对象,然后依据不同算法进行回收处理。标记清除算法简单但有碎片问题。
16、标记整理算法可解决碎片问题。复制算法适用于新生代部分区域。分代收集算法根据对象年龄特点,对新生代、老年代采用不同算法,提高垃圾收集效率。 3. 简述类加载的双亲委派模型。 答案:双亲委派模型是指类加载器在加载类时,先将加载请求委托给父类加载器,只有当父类加载器无法加载时,才由自己加载。这样保证了类的加载顺序,避免类的重复加载,也保证了核心类库的安全性。 解析:双亲委派模型从顶层的启动类加载器开始,依次向下委托。比如应用类加载器加载类时,先委托扩展类加载器,扩展类加载器再委托启动类加载器。如果启动类加载器能加载则加载,不能则依次返回由扩展类加载器或应用类加载器加载。这种模型保证了类加载的层次和顺序,防止恶意类覆盖核心类库。 4. 简述JVM即时编译器的作用及优势。 答案:即时编译器的作用是将字节码编译为本地机器码,提高程序执行效率。优势在于避免了解释执行的开销,能让程序运行速度更快,尤其是对于热点代码,通过即时编译可显著提升性能。 解析:字节码在解释执行时效率相对较低,即时编译器将热点字节码编译为本地机器码后,程序执行时直接执行本地机器码,速度大幅提升。对于频繁执行的代码块,即时编译能极大地改善性能,减少解释执行的时间消耗,使程序运行更加高效。