对于很多正在学习java编程的人来说,java虚拟机是学习的重点与难点,因为系统封装得太好,可能在写程序的时候都感受不到虚拟机的存在,这导致很多人没有系统的学习过虚拟机,但是java虚拟机是java面试中经常出现的内容,所以今天整理了10道经典java虚拟机面试题,大家可以根据下面的内容来学习java虚拟机的重点知识。

1、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

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

2、虚拟机和物理机的区别是什么?

答:这两种机器都有代码执行的能力,但是:物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面的。虚拟机的执行引擎是自己实现的,因此可以自行制定指令集和执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式。

3、解释java内存模型的概念

答:Java内存模型即Java Memory Model,简称JMM。JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式,围绕着在并发过程中如何处理原子性、可见性和有序性这3个特征来建立的 。Java 存模型规定了所有的变量都存储在主内存(Main Memory)中。每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

4、类加载器的种类?

答:(1)启动类加载器,Bootstrap ClassLoader,加载JAVA_HOME\lib,或者被-Xbootclasspath参数限定的类;(2)扩展类加载器,Extension ClassLoader,加载\lib\ext,或者被java.ext.dirs系统变量指定的类;(3)应用程序类加载器,Application ClassLoader,加载ClassPath中的类库;(4)自定义类加载器,通过继承ClassLoader实现,一般是加载我们的自定义类双亲委派模型。

5、编译执行与解释执行是什么?

答:编译执行:简单来说就是,现需要对源程序进行一个编译,生成一个目标文件,计算机再对这个目标程序进行执行。虽然这的编译的过程比上面提到的翻译的过程要复杂(通常要对代码进行语法分析,还要对代码进行优化,并分配内存,最后形成目标文件),但是一旦形成目标文件,就一劳永逸,不必再进行编译,所以执行速度较快。

解释执行:它的特点就是,对源语言写成的源语句进行一句一句的翻译,翻译一句就提交给计算机执行一句,并不会形成目标程序。它的优点是翻译本身并不费事。它的缺点是运行速度慢,比如当程序中存在循环条件时,循环体内的语句就会被多次的翻译,从而影响运行速度。

6、类装载的步骤?

答:分为以下5个步骤:(1)加载:根据查找路径找到相应的class文件然后导入;(2)检查:检查加载的class文件的正确性;(3)准备:给类中的静态变量分配内存空间;(4)解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址;(5)初始化:对静态变量和静态代码块执行初始化工作。

7、JVM调优的工具?

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

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

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

8、Java虚拟机调用字节码指令有哪些?

答:invokestatic:调用静态方法;invokespecial:调用实例构造器方法、私有方法和父类方法;invokevirtual:调用所有的虚方法;invokeinterface:调用接口方法。

9、什么是JVM内存模型?

答:Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。

10、列举一下,在java虚拟机中,哪些对象可作为ROOT对象?

答:虚拟机栈中的引用对象;方法区中类静态属性引用的对象;方法区中常量引用对象;本地方法栈中JNI引用对象。

以上就是这篇文章整理的java虚拟机面试题,共有10道题目,里面既有适合java零基础刚了解虚拟机的java初学者学习的内容,也有难度稍微大一些的面试题,适合不同能力的人学习。希望这篇文章可以对大家有帮助,顺利通过面试。