1.JVM加载Class文件的原理机制
Java的中所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身就是一个类,而它的工作就是把class文件从硬盘读取到内存中。(我们在写代码的时候不需要关系类的加载,因为类的加载是隐式装载的。除非我们使用反射的时候需要显示加载所有的类。)
Java类的加载是动态的,它并不会一次性将所有的类全部加载后再运行,而是保证程序运行的基础类完全加载到jvm中,其他的类在需要使用的时候再进行加载。(这样做的目的是节省内存的开销。)
Java的类加载器有三个,对应Java的三种类:
BootstrapLoader // 负责加载系统类(一般指的内置类。eg: String)
----- ExtClassLoader // 负责加载扩展类(就是集成类和实现类)
------------AppClassLoader // 负责加载应用类(程序员自己定义的类)
三个加载器各自完成自己的工作,但它们是如何协调工作的呢?哪一个类该由哪一个加载器完成呢?
为了解决这个问题,Java采用了委托模型机制。
委托模型机制的原理:当类加载器需要加载类的时候,先请示其父类,父类中找不到才会到自己的类中进行搜索该类。这样的自上而下的加载顺序可以保证基础类的加载。这样加载还有一个安全上的考虑,防止有人恶意将恶意的基础类加载到jvm中,委托模型机制会搜索其父类的加载器,显然是不可能找到,这样就不能将该类加载进来。
类加载的步骤:
-
装载:查找和导入class文件。
-
连接:
- 检查: 检查载入的class文件数据的正确性。
- 准备:为类的静态变量分配存储空间。
- 解析:将符号引用转成直接引用。
-
初始化:初始化静态变量,静态代码块。
2.什么是类加载器
类加载器是一个用来加载类文件的类,java源代码通过javac编译器编译类文件。然后JVM来执行类文件中的字节码来执行程序。类加载器负责加载文件系统、网络或其他来源的源文件。
3.类加载器有哪些
Bootstrap类加载器、Extension类加载器和Application类加载器。
4.类加载器双亲委派模型机制
什么是双亲委派模型(Parent-DelegationModel)?为什么使用双亲委派模型?
JVM中加载类机制采用的是双亲委派模型,顾名思义,在该模型中,子类加载器收到的加载请求,不会先去处理,而是先把请求委派给父类加载器处理,当父类加载器处理不了时再返回给子类加载器加载;
为什么使用双亲委派模型?
因为安全。使用双亲委派模型来组织类加载器间的关系,能够使类的加载也具有层次关系,这样能够保证核心基础的Java类会被根加载器加载,而不会去加载用户自定义的和基础类库相同名字的类,从而保证系统的有序、安全。