JVM虚拟机的相关面试问题

谈谈你对java的理解 ?

1、平台无关性

2、GC垃圾回收机制

3、异常处理

4、面向对象

5、类库

6、语言特性(泛型,反射等)

 

平台无关性如何实现?

java源码首先被编译生成字节码文件,再由不同平台的虚拟机jvm进行解析,java代码在不同平台上运行的时候不需要重新编译,jvm执行字节码文件时,把字节码转化成相应平台的机器指令。

 

java如何加载.class文件?

class文件是通过java虚拟机进行加载的,首先通过class Lodaer将文件加载到虚拟机中,利用Execution Engine 对命令进行解析,转化成相应的机械命令,并加以执行。

 

java的反射机制?

java反射机制时在运行状态当中,对任意一个类或者对象,都额能够知道它的方法和属性。这种动态获取信息的以及动态调用对象的功能称为java的反射机制。

 

java虚拟机(JVM)结构?

JVM虚拟机的相关面试问题

 

谈谈ClassLoader?

ClassLoader在java中有着非常重要的作用,它主要工作在class装载过程中加载阶段,其主要作用是获取系统外部的Class二进制数据流。它是java的核心组件,所有的Class文件都由其进行加载,ClassLoader负责将Class文件的二进制数据流加载到系统中,然后交给jvm进行连接,初始化等操作。

 

ClassLoader的种类?

BootStrapClassLoader : C++编写,加载核心类库java.*。

ExtClassLoader : java编写,加载扩展库javax.*。

AppClassLoader : java编写,加载程序所在目录。

自定义ClassLoader : java编写,定制化加载。

 

谈谈类加载器的双亲委派机制?

JVM虚拟机的相关面试问题

 

类的加载过程?

1.加载:通过ClassLoader加载class文件字节码,生成class对象。

2.连接:

a.校验:检查加载得class对象得正确性和安全性。

b.准备:为类变量分配存储空间并设置类变量初始值。

c.解析:JVM将常量池中的符号引用转换为直接引用。

3.初始化:执行类变量赋值和静态代码块。

 

LoadClass和ForName得区别?

Class.forName得到的class对象是已经初始化后的。

ClassLoader.LoadClass得到的class对象是还没有进行连接的。

 

JVM

JVM虚拟机的相关面试问题

程序计数器(Program Counter Register):

1.当前线程所执行的字节码行号指示器(逻辑)。

2.改变计数器的值来选取下一条需要执行的字节码指令。

3.和线程一对一的关系即“线程私有”。

4.对java方法计数,如果是native方法则计数器值为Undefined。

5.不会发生内存泄漏。

java虚拟机栈(Stack):

1.java方法执行的内存模型。

2.包含多个栈帧,栈帧包含:

a.局部变量表(Local Variable Table):包含方法执行过程中的所有变量

b.操作栈(Operand Stacck):入栈,出栈,复制,交换,产生消费变量

c.动态连接(Dynamic Linking)

d.返回地址(Return Address)

本地方法栈:

与虚拟机栈相似,主要作用于标注了native的方法。

MateSpace:

存放程序运行时所创建的栈帧,栈帧中包含,jvm指令,局部变量表,操作数栈,程序计数器。 MateSpace时线程共有的。

JAVA堆(Heap):

1.对象实例分配的区域。

2.GC管理的主要区域。

 

 

 

JVM执行程序解析

JVM虚拟机的相关面试问题

递归为什么会引发java.lang.*Error异常?

JVM虚拟机的相关面试问题

递归过深,栈帧数量超出虚拟机栈深度。

 

元空间(MateSpace)与永久代(PermGen)的区别?

1.元空间使用的是本地内存,永久代使用的是jvm的内存。

 

 

元空间(MateSpace)与永久代(PermGen)相比的优势?

1.字符串常量存在永久代中,容易出现性能问题和内存溢出。

2.类和方法的信息大小难以确定,给永久代的大小指定带来困难。

3.永久代会为GC带来不必要的复杂性。

4.方便HotSpot与其他JVM(如Jrockit)的集成。

 

JVM三大性能调优参数-Xms -Xmx -Xss的含义?

-Xms: 堆的初始值。

-Xmx: 堆能达到的最大值。

-Xss: 规定每个线程的虚拟机栈(堆栈)的大小。

注意:一般 -Xms与-Xmx的参数设成相同大小,程序堆扩容时会放生内存抖动,会造成程序的不稳定性。

 

java内存模型中堆和栈的区别?

1.内存分配策略:

a.静态存储:编译时确定每个数据目标在运行时的存储空间需求。

b.栈式存储:数据区需求在编译时未知,运行时模块入口前确定。

c.堆式存储:编译时或运行时模块入口都无法确定,动态分配。

2.其他:

a.管理方式:栈自动释放,堆需要GC。

b.空间大小:栈比堆小。

c.碎片相关:栈产生的碎片远小于堆。

d.分配方式:栈支持静态和动态的方式,而堆只支持动态的方式。

e.效率:栈的效率比堆高。

 

不同JDK版本之间intern方法的区别(1.6----1.6+)?

jdk1.6:当调用intern方法时,如果字符串常量池先前已经创建出该字符串对象,则返回池中改字符串的引用。否则,将此字符串对象添加到字符串常量池中,并返回字符串对象的引用。

jdk1.6+:当调用intern方法时,如果字符串常量池先前已经创建出该字符串对象,则返回池中改字符串的引用。否则,如果该字符串对象已经存在java堆中,则将堆中对此对象的引用添加到字符串常量池中,并返回该引用;如果堆中不存在,则在池中创建该字符串并返回其应用。