`

第五章(一) 加载、链接、初始化-运行时常量池和启动

阅读更多
    Java虚拟机动态的加载、链接、初始化类或接口。加载是通过特定的名字找到类或接口类型的二进制表示,根据找到的二进制表示创建类或接口的过程。链接是获得创建的类,将它们结合进Java虚拟机的运行时状态以使他们能够被执行的过程。初始化一个类或接口包括执行类或接口的初始化方法<clinit>.
5.1 运行时常量池
    Java虚拟机为每一个类型维续一个常量池,一种运行时的数据结构,提供类似于传统语言中符号表的服务。
    类或接口的二进制表示中的常量池表被用来在类或接口创建时构建运行时常量池。运行时常量池中的所有引用都是原始的符号,常量池中的引用按照如下规则从类或接口的二进制表示中推断出来:
   
  • 一个类或接口的符号引用从类或接口的二进制表示的CONSTANT_Class_info中推断出来。这个引用按照Class.getName方法的返回值的形式给出类或接口的名字,即:
  •         - 对于非数组的类或接口,这个名字就是对应类或接口的二进制名字。
            - 对于n维的数组,这个名字以n个ASCII字符"["开头,紧跟着数组的元素类型:
                   > 如果元素是基本类型,就是相应的类型的描述符(B C D F I J S Z)对应着 byte char double float int long short boolean
                   > 否则,对应的元素就是引用类型,这时会用ASCII字符"L"加上对应元素的二进制名字,并在后面加上ASCII字符";"来表示。

             以上信息可以通过javap -v {className} 命令查看
             本章节中只要提及类或接口的名字,都是指Class.getName方法的返回值的形式。
  • 对一个类或接口的字段的符号引用由类或接口的二进制表示中的CONSTANT_Fieldref_info结构中推导出来。这样一个符号引用会给出对应字段的名字和描述符,还会给出这个字段所在类或接口对应的符号引用。
  • 对一个类的方法的符号引用由类或接口的二进制表示中的CONSTANT_Methodref_info结构中推导出来。这样一个符号引用会给出对应方法的名字和描述符,还会给出这个方法所在类对应的符号引用。
  • 对一个接口的方法的符号引用由类或接口的二进制表示中的CONSTANT_InterfaceMethodref_info结构中推导出来。这样一个符号引用会给出对应方法的名字和描述符,还会给出这个方法所在类对应的符号引用。
  • 对一个method handle的符号引用,由类或接口的CONSTANT_MethodHandle_info结构中推导出来。根据method handle类型的不同,这样一个引用可以给出一个类或接口的字段符号引用,或者是类的一个方法的引用,或者是一个接口的方法的引用。
  • 对一个method type的符号引用从CONSTANT_MethodType_info结构中推导出来,这样的一个引用给出一个方法的描述符。
  • 对一个call site specifier的符号引用从CONSTANT_InvokeDynamic_info结构中推导出来,这样的引用会给出:
  •        - 一个method handle的符号引用,这个引用会在invokedynamic指令中作为一个启动方法。
           - 一连串的符号引用(对一个类、方法类型、method handle),字符串字面值,运行常量值,它们会做为启动方法的静态参数。
            - 一个方法名字和一个方法描述

另外,非符号引用的运行时常量值从constant_pool中查找:
  • 一个字符串字面值是一个String类型的引用,从CONSTANT_String_info结构中推导出来,CONSTANT_String_info结构是一系列的Unicode码组成了字符串字面值。
  •     Java编程语言要求相同的字符串字面值一定要指向相同的String类实例。另外,如果一个任意字符串的String.intern方法被调用,如果这个字符串之前已经出现过,那么返回结果将是同一个类实例。因此下面的表达式的结果是true
          
    ("a" + "b" + "c").intern() == "abc"

        为了推导出字符串字面值,Java虚拟机会用下面的规则检测CONSTANT_String_info结构的字符序列:
              - 如果一个String类实力已经调用过它的intern方法,并且这个这个字符串拥有和CONSTANT_String_info结构一样的Unicode 码序列,那么这个字符串字面值就是同一个字符串实例的一个引用。
              - 否则一个新的包含了CONSTANT_String_info结构中Unicode码序列的字符串实例就会被创建,一个指向新创建的字符串的引用作为字符串字面值的结果,最终,这个新字符串的intern方法被调用。
  • 运行时常量数值从CONSTANT_Integer_info,CONSTANT_Float_info, CONSTANT_Long_info, 、CONSTANT_Double_info结构中推导出来
  •     类或接口的二进制表示常量池表中其他的结构有CONSTANT_NameAndType_info和CONSTANT_Utf8_info,它们仅被直接用来推导出类、接口、字段、方法、方法类型、method handles的符号引用,或者是用来推导出字符串字面值和call site说明符。

    5.2 Java虚拟机启动
        Java虚拟机通过创建一个初始化类类启动,利用引导类加载器。Java虚拟机紧接着链接、初始化这个类,调用它的public void main(String[]) 类方法。对这个方法的调用带动所有的后续操作。执行组成main方法的Java虚拟机指令可能会引起链接其他的类或接口,也可能会调用其他的方法。
        在Java虚拟机的实现中,初始化类可以通过命令行参数提供。或者实现者也可以提供一个设定类加载器的初始化类,用这个类加载器来加载一个应用。
    分享到:
    评论

    相关推荐

      java虚拟机规范(java SE7)

      java虚拟机规范,高清PDF版本,含有目录结构:第一章:引言; 第二章:java虚拟结构(运行时区域内存:寄存器,java虚拟机栈,java堆,方法去,运行时常量池,本地方法栈);... 第五章:加载、链接与初始化

      【带书签】Java虚拟机规范(Java SE 7).pdf

      《Java虚拟机规范(Java SE 7版)》是Java领域最...第5章定义了Java虚拟机启动以及类和接口的加载、链接和初始化过程。第6章阐释并列举了Java虚拟机指令集。第7章提供了一张以操作码值为索引的Java虚拟机操作码助记符表。

      Java虚拟机规范(Java SE 7)中文版

      《Java虚拟机规范(Java SE 7版)》是Java领域最...第5章定义了Java虚拟机启动以及类和接口的加载、链接和初始化过程。第6章阐释并列举了Java虚拟机指令集。第7章提供了一张以操作码值为索引的Java虚拟机操作码助记符表。

      深入理解JVM内存结构及运行原理全套视频加资料.txt

       第28讲 Java内存区域-直接内存和运行时常量池 00:15:53  第29讲 对象在内存中的布局-对象的创建 00:21:19  第30讲 探究对象的结构 00:13:47  第31讲 深入理解对象的访问定位 00:08:01  第32讲 垃圾回收-...

      java虚拟机规范 jdk8.

      第5章定义Java虚拟机启动以及类与接口的加载、链接和初始化过程;第6章阐释并列举Java虚拟机指令集;第7章提供一张以操作码值为索引的Java虚拟机操作码助记符表。  《Java核心技术系列:Java虚拟机规范(Java SE 8...

      深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

      第28节Java内存区域-直接内存和运行时常量池00:15:53分钟 | 第29节对象在内存中的布局-对象的创建00:21:19分钟 | 第30节探究对象的结构00:13:47分钟 | 第31节深入理解对象的访问定位00:08:01分钟 | 第32节垃圾...

      Java虚拟机

      2.4.3 方法区和运行时常量池溢出 2.4.4 本机直接内存溢出 2.5 本章小结 第3章 垃圾收集器与内存分配策略 3.1 概述 3.2 对象已死吗 3.2.1 引用计数算法 3.2.2 可达性分析算法 3.2.3 再谈引用 3.2.4 生存...

      ASPNET35开发大全第一章

      第5章 Web窗体的基本控件 5.1 控件的属性 5.2 简单控件 5.2.1 标签控件(Label) 5.2.2 超链接控件(HyperLink) 5.2.3 图像控件(Image) 5.3 文本框控件(TextBox) 5.3.1 文本框控件的属性 5.3.2 文本框控件的...

      CLR.via.C#.(中文第3版)(自制详细书签)Part1

      第5章 基元类型、引用类型和值类型 5.1 编程语言的基元类型 5.1.1 checked和unchecked基元类型操作 5.2 引用类型和值类型 5.3 值类型的装箱和拆箱 5.3.1 使用接口更改已装箱值类型中的字段(以及为什么不应该...

      CLR.via.C#.(中文第3版)(自制详细书签)

      第5章 基元类型、引用类型和值类型 5.1 编程语言的基元类型 5.1.1 checked和unchecked基元类型操作 5.2 引用类型和值类型 5.3 值类型的装箱和拆箱 5.3.1 使用接口更改已装箱值类型中的字段(以及为什么不应该...

      CLR.via.C#.(中文第3版)(自制详细书签)Part3

      第5章 基元类型、引用类型和值类型 5.1 编程语言的基元类型 5.1.1 checked和unchecked基元类型操作 5.2 引用类型和值类型 5.3 值类型的装箱和拆箱 5.3.1 使用接口更改已装箱值类型中的字段(以及为什么不应该...

      CLR.via.C#.(中文第3版)(自制详细书签)Part2

      第5章 基元类型、引用类型和值类型 5.1 编程语言的基元类型 5.1.1 checked和unchecked基元类型操作 5.2 引用类型和值类型 5.3 值类型的装箱和拆箱 5.3.1 使用接口更改已装箱值类型中的字段(以及为什么不应该...

      深入理解_Java_虚拟机 JVM_高级特性与最佳实践

      / 170 第7章 虚拟机类加载机制 / 171 7.1 概述 / 171 7.2 类加载的时机 / 172 7.3 类加载的过程 / 176 7.3.1 加载 / 176 7.3.2 验证 / 178 7.3.3 准备 / 181 7.3.4 解析 / 182 7.3.5 初始化 / 186 7.4 类...

      java深入解析

      193 话题29 按部就班——初始化顺序与向前引用 206 第5章 类与接口 220 话题30 相辅相成——基本数据类型与包装类 220 话题31 分门别类——数组的阐述 232 话题32 规矩方圆——定义规范的接口类型 242 话题33 彻里至...

      ASP.NET3.5从入门到精通

      第五篇 ASP.NET 3.5 高级编程 第 15 章图形图像编程 15.1 图形图像基础 15.1.1 图像布局 15.1.2 GDI+简介 15.1.3 绘制线条示例 15.1.4 .NET Framework 绘图类 15.2 图形编程 15.2.1 Graphics 类 15.2.2 绘制基本图形...

      ASP.NET 3.5 开发大全1-5

      第5章 Web窗体的基本控件 5.1 控件的属性 5.2 简单控件 5.2.1 标签控件(Label) 5.2.2 超链接控件(HyperLink) 5.2.3 图像控件(Image) 5.3 文本框控件(TextBox) 5.3.1 文本框控件的属性 5.3.2 文本框控件的...

      DIRECTX.9.0.3D游戏开发编程基础.pdf

      第5章 光照 5.1 光照的组成 5.2 材质 5.3 顶点法线 5.4 光源 5.5 例程:光照 5.6 一些附加例程 5.7 小结 第6章 纹理映射 6.1 纹理坐标 6.2 创建并启用纹理 6.3 纹理过滤器 6.4 多级渐进纹理 6.4.1 多级...

      ASP.NET 3.5 开发大全11-15

      第5章 Web窗体的基本控件 5.1 控件的属性 5.2 简单控件 5.2.1 标签控件(Label) 5.2.2 超链接控件(HyperLink) 5.2.3 图像控件(Image) 5.3 文本框控件(TextBox) 5.3.1 文本框控件的属性 5.3.2 文本框控件的...

    Global site tag (gtag.js) - Google Analytics