类加载简介

来源:互联网 发布:韩国历史课本 知乎 编辑:程序博客网 时间:2024/04/30 09:03

一.     加载

“加载”是“类加载“过程的一个阶段。在这个阶段,JVM以字节流的形式获取.class文件,转化为方法区运行时数据结构,并在方法区生成Class对象(由此可知,Java中并不是所有对象都在堆中分配)。

二.     连接(一个比较重要的阶段,可以细分为三个小阶段)

连接阶段,目的是将已经加载到内存的类的字节流放到JVM的运行时环境,为初始化做好准备

当然,把一个类带入自己的内部环境之前,JVM肯定会验证其合法性、可靠性,尽可能的保证这个类进入环境之后能正常运作,并防止其对JVM造成破坏,就像公司招人之前也会对应聘者进行各种考核一样,这个过程就是验证阶段。

如果验证通过,那么JVM就会让这个类做好准备,做准备的过程就是将类变量(static类型的变量)分配内存(在方法区中分配),并设置初始值的过程,注意是设置初始值(各类型的零值),并不是赋值,赋值要等到初始化阶段才进行。

如 public static int value=1;

这个阶段过后value值为0,这就是准备阶段

准备好了以后,JVM就会将常量池中的符号引用替换为直接引用。在这个阶段之前,该类所拥有的字段、方法的信息并不是直接记录的,而是存储在字段表和方法表中,经过这个阶段的解析之后字段和方法的引用将直接指向目标。这就像周杰伦的半岛铁盒,服务员告诉他:“楼上右转第二排的架子上就有了“,这时半岛铁盒对周杰伦来说就是符号引用。等杰伦走到楼上第二排的架子前,半岛铁盒已经触手可及,这时就变成了直接引用了。而半岛铁盒放在什么地方,不同的店会有所不同。同理,不同的JVM解析出来的引用也会不同。这个例子在细节上不是很恰当,但是从“半岛铁盒相对于杰伦的状态变化”上看,我认为可以帮助理解这个转换。这就是解析阶段。

三.     初始化

类加载的最后一个阶段就是初始化,这个“初始化“!=“实例化”。初始化阶段,开始真正的执行程序代码,初始化类变量等。这个阶段会执行类中定义的静态代码块。类变量与静态块按其在类中定义的先后顺序执行。

       需要注意:

①  静态块不能访问定义在她之后的变量。

②  初始化子类之前会先初始化其父类

③  接口初始化时,不会初始化其父接口


文章内容整理自《深入理解Java虚拟机》

0 0