JVM之类加载机制

JVM之类加载机制

如上图所示,类从被加载到虚拟机内存中开始,到卸载为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用、和卸载7个阶段。其中验证、准备、解析统称为连接。
加载、验证、准备、初始化和卸载的顺序是确定的,依次开始,解析阶段则不一定,有些情况况下可以在初始化之后再开始,这样是为了支持Java语言的运行时绑定(对象上传等操作)。上述阶段通常都是交叉的混合进行的,通常会在一个阶段执行的过程中调用、激活另一个阶段。
JVM规范中定义了5中应该对类进行“初始化”的情况:
  1. 遇到new、getstatic、putstatic或invokestatic这四条字节码指令时候,常见的:使用new实例化对象,读取或者设置一个类的静态字段(final修饰的除外),调用一个类的静态方法。
  2. 使用java.lang.reflect包执行反射调用的时候。
  3. 初始化一个类的时候如果父类没有被初始化则先触发父类的初始化。
  4. 虚拟机启动时,main方法所在的类被初始化。
  5. JDK1.7动态语言支持时,如果java.lang.invoke.MethodHandler实例最后的解析结果为REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且句柄对应的类没有被初始化则执行初始化操作。
加载
加载过程需要完成以下任务
①通过全限定类名定义此类的二进制字节流,该二进制字节流的可能来源:
.压缩包中,通常用的第三方包
.网络中,java Applet技术
.运行时计算生成,使用最多的即动态代理技术
.其它文件生成,JSP场景
.数据库中获取
②将字节流对应的静态存储结构转化为方法区的运行时数据结构;
③在内存中生成一个代表这个类的java.lang.Class对象,作为访问该类的入口;
验证
确保Class文件的字节流中包含的信息字段符合JVM的要求等。常见的验证动作:
①文件格式验证,魔术验证,主次版本号,常量验证等
②元数据验证,父类、是否允许继承、抽象类等
③字节码验证,复杂
④符号引用验证,访问控制验证等等
准备
为类变量分配内存并设置类变量初始值的过程,该内存在方法区中分配。
.此处的初始值通常指零值
.如果类字段为静态类型则直接初始化为制定的值
解析
虚拟机将常量池内的符号引用替换为直接引用的过程。
初始化
开始执行类中定义的Java代码。初始化阶段是执行类构造器<clinit>()方法的过程(不是对象的构造器!!!)。
.<clinit>()方法是编译器自动收集类中所有类变量的赋值动作和静态语句块中的语句合并产生的。
.编译器收集的顺序是由语句在源文件中定义的顺序决定的
.<clinit>()不需要显示的调用父类的构造器,该过程由虚拟机保证完成。
.<clinit>()方法对接口来说不是必须的,如果一个类中没有静态语句块也没有对变量的赋值操作可以不生成<clinit>()方法
.执行接口的<clinit>()方法不需要先执行父接口的<clinit>()方法,只有当父接口中定义的变量使用时父接口才会实力恶化,接口的实现类在实例化时候一样不会执行接口的初始化方法。
.由虚拟机保证多线程环境下的线程安全问题。



总结
理解JNM类加载机制有助于理解Java中.class文件是如何一步步被加载到内存中,在JVM中经历了哪些流程大概完成了什么操作,对于理解静态方法,类变量的加载过程有本质上的理解。至此.class文件被加载为一个java.lang.Class对象,可以说是一个复杂的数据集合,并且该Class对象是后期生产实例Java对象的模板。

参考 "深入理解Java虚拟机"  好书与大家分享

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值