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)结构?
谈谈ClassLoader?
ClassLoader在java中有着非常重要的作用,它主要工作在class装载过程中加载阶段,其主要作用是获取系统外部的Class二进制数据流。它是java的核心组件,所有的Class文件都由其进行加载,ClassLoader负责将Class文件的二进制数据流加载到系统中,然后交给jvm进行连接,初始化等操作。
ClassLoader的种类?
BootStrapClassLoader : C++编写,加载核心类库java.*。
ExtClassLoader : java编写,加载扩展库javax.*。
AppClassLoader : java编写,加载程序所在目录。
自定义ClassLoader : java编写,定制化加载。
谈谈类加载器的双亲委派机制?
类的加载过程?
1.加载:通过ClassLoader加载class文件字节码,生成class对象。
2.连接:
a.校验:检查加载得class对象得正确性和安全性。
b.准备:为类变量分配存储空间并设置类变量初始值。
c.解析:JVM将常量池中的符号引用转换为直接引用。
3.初始化:执行类变量赋值和静态代码块。
LoadClass和ForName得区别?
Class.forName得到的class对象是已经初始化后的。
ClassLoader.LoadClass得到的class对象是还没有进行连接的。
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执行程序解析
递归为什么会引发java.lang.*Error异常?
递归过深,栈帧数量超出虚拟机栈深度。
元空间(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堆中,则将堆中对此对象的引用添加到字符串常量池中,并返回该引用;如果堆中不存在,则在池中创建该字符串并返回其应用。