JVM加载class文件的原理
Java中的类文件是通过类装载器装载到JVM的。装载器有BootstrapLoader, ExtClassLoader, AppClassLoader三个,分别负责加载系统类,扩展累,和应用类。BootstrapLoader不是ClassLoader的子类,由C++编写,因此在Java中看不见它,它主要是负责装载JRE的核心类库,如JRE目录下的rt.jar,charsets.jar等;ExtClassLoader是ClassLoader的子类,负责装载JRE扩展目录ext下的jar类包;AppClassLoader负责装载classpath路径下的类包。这3个类装载器存在父子层级关系,即根装载器是扩展装载器的父装载器,扩展装载器是应用装载器的父装载器。(除了JVM默认的三个ClassLoader以外,第三方可以编写自己的类装载器,以实现一些特殊的需求。)
Java装载类使用“全盘负责委托机制”。”全盘负责”是指当一个ClassLoader装载一个类时,除非显示的使用另外一个ClassLoader,该类所依赖及引用的类也由这个ClassLoader载入;“委托机制”是指先委托父类装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。当碰到一个类需要加载时,类装载器会先请示其Parent使用其搜索路径帮忙载入,如果Parent找不到,那么才由自己依照搜索路径搜索类。类文件被装载解析后,在JVM中都有一个对应的java.lang.Class对象,提供了类结构信息的描述。
类装载器就是寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件。类装载器把一个类装入JVM,需要经过以下3个步骤:
(1)装载:查找和导入Class文件
(2)链接:
a)检查:检查载入的class文件数据的正确性
b)准备:给类的静态变量分配存储空间
c)解析:将符号引用转成直接引用(其中解析步骤是可选的)
(3)初始化:对静态变量,静态代码块执行初始化工作。
还没有评论,来说两句吧...