首页 > 代码库 > JVM类加载

JVM类加载

加载->(验证->准备->解析)(连接)->初始化->使用->卸载

初始化只有在以下5种情况下被触发:(初始化前面的步骤自然而然发生)

1) new instance, getStatic, putStatic, invokeStatic

2) reflection

3) main()所在类

4) 子类初始化时父类被初始化

5) 动态语言支持,MethodHandle

加载: 根据全定限名加载二进制流(*.class),这提供了很大的灵活性,可以自定义类加载器来加载类。可以从jar,war,网络,动态代理等等加载。然后生成类结构保存到方法区。

验证:因为*.class可以任意编写,确保class文件格式符合一定规范,以及有没有继承final类等。

准备:为类变量提供初始零值(并非初始值)

解析: 将符号引用解析为直接引用

初始化:按程序初始化变量和其他资源

 

类加载器:

1)Bootstrap: $JAVA_HOME/lib/rt.jar

2) Extension: $JAVA_HOME/lib/ext/*.jar

3) Appliaction: 应用classpath的类

4) 自定义ClassLoader

 

双亲委派模型:类加载器具有优先级的层次关系,可以保证一个类只有优先级最高的加载器加载(比如Object由BootstrapClassLoader加载),如果用户也在classpath定义了java.lang.Object,那么系统会出现多个Object类,无法保证程序的正确运行。

ClassLoader loadClass():

先检查class是否已经load,如果没有,看parent是否load;

如果到Bootstrap都没load,则由该ClassLoader load该class

 

判断2个类是否相等(equals(), isAssignableFrom(), isInstance()),需要在ClassLoader的namespace下进行比较。如果ClassLoader不一样,两个类不相等。

 

JVM类加载