JVM加载Class过程分析
我们知道, JVM是通过调用一个 Class类得 main方法来进入一个类得,这个 main方法必须是 public、 static、 void修饰的。但是在这之前, JVM还需要做一系列的准备工作。在这节里,我们分析一个 Java类是如何被 JVM加载运行的。
JVM要调用一个类里的方法需要经过以下几个步骤:类装载、链接、初始化。
1 类装载:
JVM通过类得全限定名(包命 +类名)找到类的 .class文件。然后把这个 .class文件加载进来,这个过程需要通过 ClassLoader来实现。 JVM的类加载系统结构如下 (图 :1-1):
Boostrap ClassLoader:启动类加载器,它用来加载一些
jdk的核心类,主要负责
JAVA_HOME
/jre/lib
下的类的加载,可以通过参数
-Xbootclasspath制定需要装入的
jar包。
它本身不是用
java实现的,所以肯定不是
ClassLoader的子类了。
Extendsion ClassLoader:扩展类加载器,用来加载一些扩展类,主要负责
JAVA_HOME
/jre/lib/ext
下类的加载。此类是
ClassLoader的一个子类。
System ClassLoader:系统类加载器 也叫 Application ClassLoader 。是离我们最近的 ClassLoader了,它负责加载 CLASSPATH里指定的那些类。我们要实现自己的 ClassLoader也是继承自该类。 SystemClassLoader的父类是 Extension ClassLoader。
类的加载过程分两步:第一步:从下往上查找类是否已经加载,如果找到,直接返回已加载的类,如果没找着接着往上找。第二步:如果到 Bootstrap ClassLoader还没找到,这时 Bootstrap ClassLoader会尝试加载该类,如果成功加载,直接返回加载后的类,如果无法加载,交由 Extension ClassLoader去加载,依次类推。如果最后仍然没找到,程序会抛出 ClassNotFoundException.
2 链接:
当一个 class文件被成功加载后,接下来就要做链接了。链接就是要把二进制的 .class文件转换成可以被 jvm执行的 Class对象的过程。这个过程又分为:检验、准备、解析。
检验:就是检查 .class的结构是否正确,是否符合 Java虚拟机的语义要求。
准备:包括创建类或接口的静态域以及把这些静态域初始化为标准的缺省值。注意此处的初始化不同于后面的的初始化步骤。如有一个 static的 String 变量 str,我们知道,在 JAVA中 String变量默认的初始值是 null,此处的初始化就是将 null赋值给 str。
解析:将类中对另一个类或接口的符合引号转化成全限定名引用,将对他们的方法、字段的符合引用转化成直接引用。
3 初始化:执行类或接口中的静态初始化函数(块),将静态变量初始化。这就是我们平时理解的对静态变量赋值。
至此,一个类才加载完成,可以调用类的类变量了(静态变量)和对类进行实例化了。
以上结合java虚拟机规范及网络相关资料整理而成。
阅读更多- JVM源码分析之Java类的加载过程
- jvm加载class文件的原理机制分析
- JVM加载Class过程
- JVM源码分析之Java类的加载过程
- Jetty class loader 类加载过程源码分析初稿
- java虚拟机类加载过程内存情况底层源码分析及ClassLoader讲解
- Java学习之类加载全过程_JVM内存分析_反射机制核心原理_常量池理解
- Dalvik加载Class过程分析
- java虚拟机类加载过程内存情况底层源码分析及ClassLoader讲解
- 从源码分析Android的Classloader加载过程
- [jvm解析系列][九]类的加载过程和类的初始化。你的类该怎么执行?为什么需要ClassLoader?
- ClassLoad的加载过程及分析
- jvm 加载class文件过程
- 转 JVM加载class文件的原理
- JVM加载Class文件的机制
- java动态加载指定的类或者jar包反射调用其方法-涉及其他jar中的类就报ClassNotFound问题分析及解决思路
- Launcher3源码分析 — 数据加载过程
- 类的加载、连接与初始化过程的详细分析(下)
- 全志A10 Bootload加载过程分析
- 从JVM分析Java的类的加载和卸载机制