`
躁动的绵羊
  • 浏览: 94314 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

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


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

类型生命周期过程: 装载——>连接——>初始化——>卸载
装载:把二进制的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实现可能为一些数据结构分配内存,目的是为了提高程序的性能,如方法表,它包含指向每一个方法的指针

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


     由于篇幅太大,所以,初始化和卸载在后面篇章中描述
  • 大小: 161.9 KB
5
1
分享到:
评论
2 楼 fly_jj 2010-10-08  
感觉深挖会无法自拔。。。
1 楼 iq527 2010-10-03  

博主看完之后能导出PDF共享么? 


比自己看书要省事 ^.^

相关推荐

Global site tag (gtag.js) - Google Analytics