博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM 类加载过程
阅读量:6701 次
发布时间:2019-06-25

本文共 1081 字,大约阅读时间需要 3 分钟。

类从加载到虚拟机到卸载,它的整个生命周期包括:加载(Loading),验证(Validation),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using)和卸载(Unloading)。其中,验证、准备和解析部分被称为连接(Linking)。

加载:

        在加载阶段,虚拟机主要完成三件事:

1.通过一个类的全限定名来获取定义此类的二进制字节流。

2.将这个字节流所代表的静态存储结构转化为方法区域的运行时数据结构。

3.在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区域数据的访问入口。

验证:

        验证阶段作用是保证Class文件的字节流包含的信息符合JVM规范,不会给JVM造成危害。如果验证失败,就会抛出一个java.lang.VerifyError异常或其子类异常。验证过程分为四个阶段:

1.文件格式验证:验证字节流文件是否符合Class文件格式的规范,并且能被当前虚拟机正确的处理。

2.元数据验证:是对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言的规范。

3.字节码验证:主要是进行数据流和控制流的分析,保证被校验类的方法在运行时不会危害虚拟机。

4.符号引用验证:符号引用验证发生在虚拟机将符号引用转化为直接引用的时候,这个转化动作将在解析阶段中发生。

准备:

        准备阶段为变量分配内存并设置类变量的初始化。在这个阶段分配的仅为类的变量(static修饰的变量),而不包括类的实例变量。对已非final的变量,JVM会将其设置成“零值”,而不是其赋值语句的值:

pirvate static int size = 12;

        那么在这个阶段,size的值为0,而不是12。 final修饰的类变量将会赋值成真实的值。

解析:

        解析过程是将常量池内的符号引用替换成直接引用。主要包括四种类型引用的解析。类或接口的解析、字段解析、方法解析、接口方法解析。

初始化:

        在准备阶段,类变量已经经过一次初始化了,在这个阶段,则是根据程序员通过程序制定的计划去初始化类的变量和其他资源。这些资源有static{}块,构造函数,父类的初始化等。

        至于使用和卸载阶段阶段,这里不再过多说明,使用过程就是根据程序定义的行为执行,卸载由GC完成。

参考资料:

        《深入Java虚拟机》 周志明 

        《深入JAVA虚拟机第二版》 Bill Venners

 

文章转自:http://blog.csdn.net/ol_beta/article/details/6793884

 

你可能感兴趣的文章
【CentOS 7笔记11】,目录权限,所有者与所有组,隐藏权限#171022
查看>>
Mybatis 详解--- 一级缓存、二级缓存
查看>>
2013 ACM/ICPC Asia Regional Changsha Online - C
查看>>
ACM中java快速入门
查看>>
discuz x2.5插件开发傻瓜图文教程,用demo说话
查看>>
利用HTML中的XML数据岛记录浏览
查看>>
unicode字符、python乱码问题
查看>>
cobbler get-loaders 通过代理下载
查看>>
通过脚本测试ubuntu的源
查看>>
一些不错的网站
查看>>
safari的一些问题
查看>>
面试官问我:平常如何对你的 Java 程序进行调优?
查看>>
Java中对象和引用的理解
查看>>
如何有效抓取SQL Server的BLOCKING信息
查看>>
bash中(),{},(()),[],[[]]的区别
查看>>
Oracle PL/SQL匿名块(三)
查看>>
模拟实现strstr
查看>>
解决Office系列安装不上的办法
查看>>
vimdiff的简单使用
查看>>
我的友情链接
查看>>