码迷,mamicode.com
首页 > 其他好文 > 详细

JVM类加载

时间:2017-03-23 03:19:35      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:方法区   步骤   继承   变量   比较   使用   格式   类变量   jar   

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

初始化只有在以下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类加载

标签:方法区   步骤   继承   变量   比较   使用   格式   类变量   jar   

原文地址:http://www.cnblogs.com/lruihan/p/6602936.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!