专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 必考虚拟机面试题(附答案)

必考虚拟机面试题(附答案)

更新时间:2020-11-02 18:14:03 来源:动力节点 浏览2510次

虚拟机对于java程序员来说肯定不陌生,在实际的开发工作中会使用到虚拟机,java虚拟机的使用是程序员必会的技能之一,所以在java面试题中少不了虚拟机的知识,这篇文章总结了一些虚拟机面试题,是在面试中出现几率很大的题目,有面试需要的朋友们可以来学习下面的内容。

1、什么是Java虚拟机?

答:Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。Java被设计成允许应用程序可以运行在任意的平台,而不需要java程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。

2、介绍下四种引用?

答:强引用:在程序代码之中普遍存在的,类似“Object obj=new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。

软引用:用来描述一些还有用但并非必需的对象,使用SoftReference类来实现软引用,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。

弱引用:用来描述非必需对象的,使用WeakReference类来实现弱引用,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。

虚引用:是最弱的一种引用关系,使用PhantomReference类来实现虚引用,一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。

3、解释内存中的栈、堆和静态区怎样使用?

答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在静态区中。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。

4、JVM永久代中会发生垃圾回收吗?

答:垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。

5、Java内存堆和栈区别有什么?

答:(1)栈内存用来存储基本类型的变量和对象的引用变量,堆内存用来存储Java中的对象,无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中;

(2)栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存,堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问;

(3)如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.StackOverFlowError,如果是堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError

(4)栈的内存要远远小于堆内存,如果你使用递归的话,那么你的栈很快就会充满,-Xss选项设置栈内存的大小。-Xms选项可以设置堆的开始时的大小。

6、类的生命周期分什么阶段?

答:加载过程:通过一个类的全限定名来获取定义此类的二进制字节流,将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。在内存中(方法区)生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口;

验证过程:为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,文件格式验证、元数据验证、字节码验证、符号引用验证;

准备过程:正式为类属性分配内存并设置类属性初始值的阶段,这些内存都将在方法区中进行分配;

解析阶段:虚拟机将常量池内的符号引用替换为直接引用的过程;

初始化阶段:类初始化阶段是类加载过程的最后一步。初始化阶段就是执行类构造器()方法的过程。

7、JVM调优的工具有什么?

答:JDK自带了很多监控工具,都位于JDK的bin目录下,其中最常用的是jconsole和jvisualvm这两款视图监控工具。

jconsole:用于对 JVM中的内存、线程和类等进行监控;

jvisualvm:JDK 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc变化等。

8、引起类加载操作有什么行为?

答:(1)遇到new、getstatic、putstatic或invokestatic这四条字节码指令;(2)反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化;(3)子类初始化的时候,如果其父类还没初始化,则需先触发其父类的初始化;(4)虚拟机执行主类的时候(有 main(string[] args));(5)JDK1.7 动态语言支持。

9、GC是什么?为什么要GC?

答:GC 是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存。回收会导致程序或系统的不稳定甚至崩溃,java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,java语言没有提供释放已分配内存的显示操作方法。

10、 JVM 有哪些垃圾回收算法?

答:(1)标记-清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片;(2)复制算法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,只有原来的一半;(3)标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存;(4)分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法。

以上是对必考虚拟机面试题的总结,这里整理了10道题目,是常考的经典java虚拟机面试题。因为虚拟机属于java零基础教程中的内容,所以是程序员面试中必会的基础知识,希望朋友们可以认真学习这10道虚拟机面试中涉及到的知识点,遇到不会的及时查漏补缺,顺利通过面试。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>