JVM类加载机制

2019-08-09 00:00:00 jvm 加载 机制

JVM类加载器

类加载器是用来加载 Java 类到 Java 虚拟机中的。Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象

JVM类加载过程图解

《JVM类加载机制》
1)装载:查找和导入Class文件
2)链接:执行校验,准备,解析步骤
a)校验:检查载入Class文件数据的正确性
b)准备:给类的静态变量分配存储空间
c)解析:将符号引用转换为直接引用
3)初始化:对类的静态变量,静态代码块执行初始化工作
类装载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java运行时系统组件。它负责在运行时查找和载入Class字节码文件。JVM运行时会产生3个ClassLoader;根转载器,ExtClassLoader(扩展类装载器)和AppClassLoader(应用类装载器)。根类装载器不是ClassLoader的子类,它适应C++语言编写,因而在java中看不到它,根装载器负责装载JRE的核心类库,如JRE目标下的rt.jar,charset.jar等。ExtClassLoader和AppClassLoader都是ClassLoader的子类,ExtClassLoader负责装载JRE扩展目录ext的JAR类包:AppClassLoader负责装载Classpath路径下的类包。
这3个类装载器之间存在父子层级关系,即根装载器是ExtClassLoader的父装载器,ExtClassLoader是AppClassLoader的父装载器,默认情况下,使用AppClassLoader装载应用程序类。
《JVM类加载机制》
运行以上的程序可以知道,当前的ClassLoader是AppClassLoder,其父ClassLoader是ExtClassLoader,祖父ClassLoader是根类装载器。java无法获取它的句柄,所以返回是null

JVM装载器委托机制

《JVM类加载机制》
JVM类装载时使用“全盘负责委托机制”,全盘负责是指当一个ClassLoader装载一个类时,除非显示地使用另一个ClassLoader,该类所依赖及引用的类也由这个ClassLoader载入;委托机制是指先委托父装载器寻找目标类,只有在找不到的情况下才从自己的类路径下查找并装载目标类。由于全盘负责委托机制可以避免安全隐患的发生。

相关文章