JVM面试题汇总
1.强引用、软引用、弱引用、虚引用是什么,有什么区别?
-
强引用:普通的对象引用关系,如 Cat cat = new Cat();
-
软引用:用于维护一些可有可无的对象,只有在内存不足时,系统则会回收软引用对象
-
弱引用:相比软引用来说,要更加无用一些,它拥有更短的生命周期,当 JVM 进行垃圾回收时,无
论内存是否充足,都会回收被弱引用关联的对象
-
虚引用:是一种形同虚设的引用,它主要用来跟踪对象被垃圾回收的活动。
2.什么是类加载?类加载的过程?
-
类加载:虚拟机把描述类的数据(字节码文件)加载到内存里面,并对数据进行校验、准备、解析和初始化,最终变成可以被虚拟机直接使用的class对象;
-
类的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析
(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。
- 加载:将字节码从不同的数据源(可能是class文件,也可能是jar包,甚至网络)转化为二进制字节流加载到内存中,并在堆中生成一个代表该类的Class对象
- 连接--验证:验证该class文件中的字节流信息复合虚拟机的要求,不会威胁到jvm的安全;
- 连接--准备:JVM会在该阶段对静态变量,分配内存并默认初始化(0,null,false等)
- 连接--解析:该阶段主要完成符号引用转化成直接引用;
- 初始化:到了初始化阶段,才开始执行类中定义的java代码;初始化阶段是调用类构造器的过程;
3. 什么是双亲委派模型?为什么需要双亲委派模型?
-
当一个类加载器收到一个类加载的请求,他首先不会尝试自己去加载,而是将这个请求委派给父类加载
器去加载,只有父类加载器在自己的搜索范围类查找不到给类时,子加载器才会尝试自己去加载该类;
-
为了防止内存中出现多个相同的字节码;因为如果没有双亲委派的话,用户就可以自己定义一个
java.lang.String类,那么就无法保证类的唯一性。
4.列举一些你知道的打破双亲委派机制的例子,为什么要打破?
-
Tomcat,应用的类加载器优先自行加载应用目录下的 class,并不是先委派给父加载器,加载不了
才委派给父加载器。