1.JVM加载class文件的原理机制?
JVM即Java Virtual Machine ,Java 虚拟机。Java中的所有类都必须装载到JVM中才能运行,java中类的装载由JVM的类加载器完成,类加载器的实际工作就是将class文件从硬盘读取到内存中。
Java中的类大致可以分为三种:
1)系统类
2)扩展类
3)由程序员自定义的类
而类的加载器也分为三种,即BootstrapLoader、ExtClassLoader、AppClassLoader。类加载器本质上也是类,它们的功能就是将类加载到JVM中。他们的结构如下:
Bootstrap Loader - 负责加载系统类
|
- - ExtClassLoader - 负责加载扩展类
|
- - AppClassLoader - 负责加载应用类
而类加载器的工作原理是什么哪?类加载器的工作原理基于三个机制:委托、可见性和单一性。
委托机制
当一个类加载和初始化的时候,类仅在有需要加载的时候被加载。假设你有一个应用需要的类叫作Abc.class,首先加载这个类的请求由 Application类加载器委托给它的父类加载器Extension类加载器,然后再委托给Bootstrap类加载器。Bootstrap类加载器 会先看看rt.jar中有没有这个类,因为并没有这个类,所以这个请求由回到Extension类加载器,它会查看jre/lib/ext目录下有没有这 个类,如果这个类被Extension类加载器找到了,那么它将被加载,而Application类加载器不会加载这个类;而如果这个类没有被 Extension类加载器找到,那么再由Application类加载器从classpath中寻找。记住classpath定义的是类文件的加载目 录,而PATH是定义的是可执行程序如javac,java等的执行路径。
可见性机制
可见性的原理是子类的加载器可以看见所有的父类加载器加载的类,而父类加载器看不到子类加载器加载的类。
单一性机制
即父加载器加载过的类不能被子加载器再次加载。
2.JVM的类加载过程
JVM将类加载过程分为三个步骤:装载(Load)、链接(Link)、和初始化(Initialize)。
而其中链接又分为三个步骤:验证、准备和解析。
1)装载:查找并加载类的二进制数据。
2)链接:
验证:确保被加载类的正确性。
准备:为类的静态变量分配内存,并赋予其默认值。
解析:把类中的符号引用转换为直接引用。
3)初始化:为类的静态变量赋予正确的初始值。
3.类什么时候才被初始化
1)创建类的实例,即new一个对象。
2)访问类的静态域
3)反射(Class.forName("com.study.Test"))
4) 初始化一个类的子类(会首先初始化子类的父类)