引言:
在这个信息时代,对于准备进入大厂工作的朋友们来说,对于JVM(Java虚拟机)的掌握是面试中的一项重要内容。下面是一些精选的JVM面试题,希望对大家能有所帮助。
正文:
1. JVM有哪几种垃圾收集器?每种的特点是什么?
JVM主要有以下几种垃圾收集器:Serial收集器、ParNew收集器、Parallel收集器、CMS收集器和G1收集器。每种垃圾收集器都有各自的特点,比如Serial是单线程的垃圾收集器,适用于单核处理器;ParNew是Serial的多线程版本;Parallel则重视系统的吞吐量;CMS设计目标是获取最短的回收停顿时间;G1是一种适用于大内存机器的垃圾收集器。
2. 新生代和老年代的垃圾收集策略有什么不同?
新生代通常采用复制算法,老年代多采用标记-整理或标记-清除的策略。新生代因为对象存活率低,使用复制算法可以快速回收;而老年代因为对象存活率高,使用标记-整理可以减少内存的碎片化。
3. 类加载器的双亲委派模型是什么?
双亲委派模型是类加载器的一种组织结构,在这种模型中,除了顶层的启动类加载器外,其余的类加载器都应有自己的父类加载器。类加载的时候,先委托父类加载器加载,父类加载器不能加载的情况下,才由子类加载器自己去加载。
4. 为什么要有方法区?
方法区是用来存储类信息、常量、静态变量等数据。它是各个线程共享的数据区域,目的是为了存放类相关的信息,保证类的数据只有一份,节省内存空间,同时也满足类数据的安全访问。
5. Full GC 是什么情况下触发的?
Full GC主要是在老年代空间不足、方法区空间不足、System.gc()被显示调用、使用JNI的引用时,JNI调用了System.gc()时触发。
6. JVM的内存模型中的Eden区、Survivor区和Tenured区分别是什么?
在JVM的内存模型中,堆内存被分为新生代和老年代。新生代中含有一个Eden区和两个Survivor区(通常称为From和To)。Eden区用于存放新生成的对象。当Eden区满了,会触发一次Minor GC,还存活的对象会被移动到一个Survivor区。对象在Survivor区中存活了一定次数GC后,如果还没有被回收,那么会被移动到Tenured区,即老年代。
7. 描述一下Minor GC与Full GC的区别是什么?
Minor GC是指发生在新生代的垃圾收集动作,因为Java对象大多具备朝生夕灭的特性,所以Minor GC非常频繁,回收速度也比较快。Full GC是指清理整个Java堆和方法区,包括新生代、老年代、永久代(或元空间),因此Full GC的速度一般较慢。
8. 什么情况下会发生栈内存溢出?
当线程请求的栈深度大于JVM所允许的深度,会抛出StackOverflowError异常。如果虚拟机栈可以动态扩展,当扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。
9. 简述Java内存模型(JMM)及其重要性。
Java内存模型定义了共享内存中,各种变量的访问规则,以及在多线程程序中如何通过这些规则来实现线程之间的互斥和可见性保证。JMM能够确保一个线程修改的变量值,对其他线程是可见的,避免了线程间的数据不一致。
10. 对象的finalize()方法什么时候被调用?它用来做什么?
finalize()方法是对象被垃圾回收器标记并准备回收之前调用的。它用来释放资源,但不推荐使用,因为没有保证何时被调用,甚至是否会被调用,JDK 9已经废弃。
结束语:
以上题目只是冰山一角,JVM领域非常广泛,包括内存模型、类文件结构、类生命周期、虚拟机性能监控与故障处理工具等等,每一个方向都可以深入研究,而深厚的理解和实践经验往往是通过不断学习和工作中的实际应用积累起来的。希望通过这些面试题,能让你在下一个面试中更加自信,最终赢得理想工作岗位。祝你好运!