深入JVM——类型的生命周期(一)

转自 http://xtu-tja-163-com.iteye.com/blog/769226

类型:类的描述信息,如此类有哪些局部变量、方法以及它的父类是什么等
类型存储地址:内存中的方法区


类型的生命周期的简单描述

类型生命周期过程: 装载——>连接——>初始化——>卸载
装载:把二进制的java类型(class文件)读入到java虚拟机中
连接:把读入的类型数据合并到虚拟机运行状态中去,连接包括三个子步骤:验证、准备和解析
初始化:给类型变量赋予适当的初始值

整个过程如下图所示:
    


    下面对类的生命周期作个详细描述

    类的装载
   
    如上所说,装载即是读入二进制数据流到内存中的方法区(指定Class文件内容),并形成一定的数据结构(数据结构可理解为存储类中局部变量、方法等类属性的一种方式)。装载过程主要包括如下三个步骤:
    1.通过该类的完全限定名(全路径类名),到指定目录查找并读取对应的class文件,形成二进制数据流
    2.解析读取的二进制数据流,在方法区类形成内部数据结构.(类中局部变量、方法、父类引用存储到方法区指定地址等)
    3.创建一个该类型的java.lang.Class类的实例

补充:1). 装载通过类装载器来完成的。类装载器可以是启动类装载器,也可以是用户自定义的类装载器。
      2). 类装载器并不一定需要等到某个类首次使用时才去装载他们,JVM规范允许类装载器缓存java类的二进制表现形式,在预料某个类将要被使用时,类装载器可以预先装载它
      3). 如果一个类在被预先装载的过程中遇到问题,出现异常,如遇到缺失或错误的class文件等,在装载时,类装载器不会报告错误,只有等到程序主动使用该类是才会报告错误

   
    连接阶段
   
连接里有分为三个子步骤,即验证准备解析
    验证步骤确保了java类型数据格式的正确性,并且适合于JVM使用。不管怎样,JVM实现中的特定类型检查一般都是在特定时间发生的,也许在验证阶段前作的处理,或在验证阶段后作的处理,但在逻辑上,我们都把它们归属为验证。类装载时做的验证有以下几种(验证前的处理):
    1.比如说,在装载过程中,JVM会解析二进制数据流以构成类型特定的数据结构,在解析期间,JVM一般会检查二级制数据,以确保二进制数据的初始工作不会导致虚拟机崩溃,或检查二进制数据是否是预期格式。虽然这些检查都是在装载期间完成,是在正式连接验证之前进行,但逻辑上它们仍属于验证阶段
     2.除了Object以为,每个类都有一个超类,在装载某个类时,它必须确保该类的超类也已经被装载了。
     在大部分JVM实现中,还有一种验证往往发生在正式验证阶段之后,那就是符号引用的验证。符号引用的验证一般发生在连接的解析阶段,这时的处理大致是JVM通过保存在常量池中的符号来查找引用的类、接口、字段或方法,把符号换成直接引用。但JVM搜索到一个符号时,必须保证该符号对应的类、接口、字段或方法等必须存在。
     那具体的在连接验证阶段作哪些验证呢?首先,确保各个类之间二进制兼容的检查:
      1.检查final类不能拥有子类
      2.检查final方法不能被覆盖
      3.确保类型和超类型之间没有不兼容的方法声明(如方法名、参数相同,但返回值不同等)
 
    准备阶段负责为装载的类型分配所需的内存,比如说为类变量分配内存,设置默认初始值,如int类型变量默认初始值为0。在准备阶段,JVM实现可能为一些数据结构分配内存,目的是为了提高程序的性能,如方法表,它包含指向每一个方法的指针

     解析阶段负责把常量池中的符号引用转换为直接引用,当然,虚拟机可以推迟解析这一步,它可以在运行中程序真正使用某个符号时采取解析它


     由于篇幅太大,所以,初始化和卸载在后面篇章中描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值