JVM类加载机制

类加载机制有 加载-验证- 准备-解析- 初始化-使用-卸载 七个阶段 这些阶段都是交叉的混合进行的。通常在一个阶段执行的过程中调用,激活另一个阶段。 

这里只讨论 加载 ,和初始化 这两个阶段。 

类的初始化

5种情况必须对类进行初始化

1.new 实例化对象的时候,调用类的静态属性,静态方法的时候(被final 修饰的字段除外, 因为这个字段已经在编译期间放入class文件的常量池中了)

2.使用 java.lang.reflect 包的方法对类进行反射调用的时候。

3.当初始化一个类的时候。如果父类没有初始化,要先初始化父类。

4.当虚拟机启动时。用户需要指定一个要执行的主类(包含main方法的那个类),虚拟机会先初始化这个主类。

5.当使用jDK1.7的动态语言支持时。。。。。。()

不能对类进行初始化

1.子类调用父类的静态属性。只能初始化父类,不会导致子类初始化。

2. 调用final 修饰的常量。 不能进行类的初始化(常量在编译阶段存入调用类的常量池中。本质上并没有直接引用到定义常量的类,因此不会触发定义的常量的类的初始化)

3.通过数组定义来引用类, 不会触发此类的初始化。

类的加载

类是通过类的加载器来进行加载的。 

java中通过加载类的类加载器   和  该类的本身 来确定类的唯一性。也就是说 比较两个类是否相等。 只有在这两个类是由同一个类加载器加载的前提下才有意义。

类加载器在类的层次划分,热部署,代码加密等领域大放异彩。

启动类加载器 (bootstrap ClassLoader) c++语言编写。是JVM的一部分,负责加载JAVA_HOME\lib目录下的类库加载到JVM中

扩展类加载器(Extension ClassLoader):这个加载器由 sun.misc.Launcher$ExtClassLoader实现。负责加载JAVA_HOME\lib\ext 目录下的类库加载到JVM中,

开发者可以直接使用这个类加载器

应用程序类加载器(Application ClassLoader)由于这个类加载器是ClassLoader中的 getSystemClassLoader() 方法返回的。也称为 系统类加载器,

负责加载用户类路径上所指定的类库,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器

 

posted @ 2017-08-21 16:35  xie风细雨  阅读(31)  评论(0)    收藏  举报