`
yuyiming1986
  • 浏览: 62092 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

深入JVM读书笔记之类装载+连接+初始化

阅读更多
    Java虚拟机通过装载,连接和初始化一个Java类型,来创建一个新的类型对象,使此类型可以被正在运行中的Java程序所使用。装载就是把二进制形式的Java类型读入Java虚拟机中;而连接就是把这种已经读入虚拟机的二进制形式的类型数据合并到虚拟机的运行时状态中去;初始化则是给类对象成员变量赋予正确的初始值,通过调用构造函数,静态初始块或者构造块实现。




装载

  装载阶段由三个基本动作组成,要装载一个类型,Java虚拟机必须:

  (1).通过此类型的完全限定名,产生一个代表此类型的二进制数据流。
      class文件可以从多个源进行加载:
      本地文件系统上装载一个java class文件
      从一个ZIP, JAR, CAB或者其他某种归档文件中提取Java class文件
      从一个专有数据库中提取Java class文件
      把一个Java源文件动态编译为class文件格式
      通过网络下载 一个Java class文件

  (2).解析这个二进制数据流为方法区内的内部数据结构。(也就是此类型的,成员方法,成员属性,实现或者继承的接口,父类等等)

  (3).创建一个表示此类型的java.lang.Class类的实例。装载步骤的最终产品就是这个Class为的实例对象,它成为Java程序与内部数据结构之间的接口。要访问关于此类型的信息(它们存储在内部数据结构中,具体是方法区中),程序可以调用此类型对应的Class实例对象的方法。(通过Class对象的接口可以用来实现反射机制,在Java程序运行时,动态获取类的成员信息)

   这样一个过程,就是把一个类型的二进制数据解析并存储为方法区中的内部数据结构,并在堆上建立一个Class对象,被外部Java程序用来访问此类型的所有信息。通过类装载器来实现将Class文件装载进入Java虚拟机。


  连接
  连接分为三个子步骤:
  (1).验证  确保了Java类型数据格式正确并且适合java虚拟机使用。
  (2).准备  负责为此类型分配它所需的内存,比如为它的类变量分配内存,并设置默认的初始值,并不会执行任何代码。
  (3).解析 负责把常量池中的符号引用转换为直接引用,在一个Java类中会包含对其它类或接口的形式引用,包括它的父类,所实现的接口,方法形参,返回值的Java类。解析的过程就是确保这些引用的类能够被正确的找到,解析的过程可能会导致其它的Java类被加载。

      虚拟机的实现可以推迟解析这一步,它可在当运行中的程序真正使用某个符号引用时再去解析.解析过程就是在类型的常量池中查找类,接口,字段和方法的符号引用,把这些符号引用替换成直接引用的过程,在符号引用被程序首次使用之前,连接的这个步骤都是可选的。

初始化
  为了准备让一个类或者接口被首次主动使用,最后一个步骤就是初始化,也就是为类变量赋予正确的初始值。正确的初始值是和在准备阶段赋予的默认初始值对比而言的。通过初始化块,static块,构造函数来实现的.
  • 大小: 25.1 KB
分享到:
评论
1 楼 zhengjj_2009 2012-04-20  
问你一个小问题,“Java虚拟机通过装载,连接和初始化一个Java类型”中的“一个Java类型”是指什么?你是看《深入JVM》这本书摘录的吗?我是查看了英文版的《深入JVM》才知道一个Java类型是指啥含义。

相关推荐

Global site tag (gtag.js) - Google Analytics