Java虚拟机解释执行机制研究
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
… … SOFn胍 REDEVE10P啊E_T&APPLIC^T10_…………………………………… ……… …………… ………
Java虚 拟机解释执行 机制研 究
王 克伟 。胡 立 东 (江苏省车辐 中等专业学校 ,江苏 徐州 221344) 摘 要 :以广泛使 用的 Java虚拟机 实现一 HotSp0t JVM 为研 究对 象,探 讨 了 Java虚拟机 解释执 行的一般 原理 和 内在机制 。 目的在 于揭 示 Java程序在 虚拟机 上的执行 过程 ,激 发广 大计 算机研 究人 员和从 业者 对底层技 术的研 究兴趣 ,从 而更好地 掌握 计算机技术和使 用计算机 工具 关键词 :Java语言 ;虚拟机 ;解释器
表 2 Java指令分类
分类 常量操 作 加 载操 作 存储 操作 栈操作 算数操作 转换操 作 比较操 作 控 制 操 作
字节 码 0x0 —0x14 0xl5——Ox35 0x36.—0x56 0x57—Ox5f 0x6(卜 Dx84 0x85—-Ox93 0x94——0xa6 Oxa7——Oxb1
述 、字段 信息描 述 、方法信 息描述 、类 属性信 息描述 。
常量 池信息描述部 分 由常量池个数 字段确定常量 池条 目 的数 量 ,每个常量池 条 目根据其类 型确定其大小 .常量
9:jnvokevirtuaI槲 : 12:return
、 兰/ "/  ̄电-20啊18.0技9 与
(1)加载 :将类文件 中的类信息加载到 内存 中。 (2)验 证 :执 行 必要 的类 信 息 的正确 性 、合 法 性 校 验 .. (3)准备 :为类变量 分配空 间并准备好虚 函数 表和 接 口方法表 ,为类访问做好准备 。 (4)解析 :将常量池 中对类 、方法 、字段 的符号引 用 解析 为对应 的内存地址 。 (5)初始化 :执行类初始化 函数 。 3.2 指令模板 指 令模板 是指 为 每一 条 Java指令 生成 一小 段 本地 代码 .并 以字节码 为索引将这些 本地代码 的地 址保存在 一 维 数组 中。 当执 行一 个 Java函数 时 ,以 当前 Java函
讨论模板解释器的运作原理之前 .首先说 明一下 类 的加载过程 。类加载是指将类 信息从 文件形式描述 转 换 成 内存形式描述 .并为类 的使用 和访 问做好 准备 .类 的加载过程包括加载 、链接 、初 始化 3个 阶段 。其 rtl链 接 过 程 义包 括验 证 、准备 、解 析 (可选 )3个子 阶段 。 各 阶段的简单描述如下 :
样6=Class
#24: //java/lang/Object
#7 = Utf8
<init>:
#8 = Utf8
()V:
#9 = Utf8
Code;
#1 0 = Utf8
LineNum berTable;
#1 1= Utf8
main;
令 序列 。Java指令 集是 由 Java虚拟 机规 范 定 义的 、具 有 固定 指令 个 数和 语义 的字节 码 序列 。通 常 一 条 Java 指令 对应单个字节 ,即只含有操 作码 ,操作数 默认使用 表 达 式栈 的栈 顶 数据 ,部 分 Java指 令 对 应 多个 字节 , 即含有操 作码和操作数两部分 ,操作数根据操 作码 的不 同而有所区别 ,对于加载存储类 指令 ,操作数 通常是局 部 变量 表 的索 引 。Java指令 集 的分类 以及 Java示例 代 码对应 的字节码如表 2所示 。
样1 7= NameAndType #7:}}8: // ”<init>“:0V
样1 8= NameAndType 襻1 3:挣1 4: // myfunc:(I)l
由表 1可以看 出 ,类 文件结构 主要 由以下几 部分构
成 :类基 本信 息 描述 、常 量池 信息 描 述 、接 1:3信 息 描
描 述 将各类常 最值放人栈 从 LvT或数组 加载数据到栈 将 栈数据存储到 LVT或数组
栈顶数据复制 基本类型 的算数运算 各类 型数 据之间的转换 栈 顶数据比较控制指令转移
指令返 回或跳转
#1 2=Utf8
#13 = Utf8 样14= Utf8 #1 5 = Utf8
Maslc(魔数 )
版本 号
次版本号 主版本号
常量池
常量池 个数 常量池条 目
字节数 4 2 2 2
可变
收稿 日期 :2018—06—19
…
. , . …
。 。 . 。
。
。
。
…
…
…
…Baidu Nhomakorabea
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
实 用第一 智慧 密集
.
.
Java源 程序 是按 照 Java语 法编 写 的表达 特 定 功能 的一段代码 。与 c或 c++语言相 比 ,Java语 言的优势在 于其提供 了丰富的类 库支持 、 自动化 的内存 管理 、跨平 台执行等特性 。Java源程序 可以看作是 由众多类组 成 的 集合 ,编写 Java代码是实 质上是 在编写不 同的 Java类 。 以下是 一个 简单 的 Java类 的定 义 ,更 详细 的 Java程序 编写规则可 以参考 Java语 言规范。
major version:50
flags:ACC PUBLIC,ACC SUPER
—
—.
Constant pool:
祥1=Methodref 桶 .撑1 7: //java/lang/Object."<
finit>“:()V
样2= Methodref #5.撑1 8: //mytest.myfunc:(I)1
l 概 述 目前 ,Java已经 是世界上最流行 的语言之一 ,广 泛
应 用于互联 网 、企业 网 、嵌入式设备 等众多领 域 Java 流行 的一个 重要原 因得益 于 Java程序 跨平 台执行 的优 势 , 即 一 次 编 译 后 可 以 在 任 何 安 装 有 Java虚 拟 机 (JVM)的机 器上 运行 。虽然 Java程序 是平 台无 关 的 . 但 Java虚拟 机 却是 平 台相 关 的 。在 某 种意 义 上 .Java 语 言使 用上 的简便 性是建 立 在 Java虚 拟 机实现 的 复杂 性 的基础 之 上的 。探 讨 的 Java虚拟机 解 释执 行机 制是 Java官方 采用 的 HotSpot JVM。在 Intelx86 32位 CPU架 构下 的实现 。 2 解释执行基础
如 下所示 的 Java示 例代 码 只包含 了两 个 简单 的静
态方法的定义 ,其 中 main方法 为 Java程序的人 口方法 , 包含 main方法的类 为启 动类 、在 Java虚 拟机 开始执行 main方 法时 ,Java启动代码 (Java命令 )先将 动类加 载到虚 拟机 中 ,再找 到 main方 法 的对应 的信息 ,最后 通 过特 定 的接 [】(Java Native Interfaee)调用 跳转 到虚 拟机 中执行 main方法对应 的 Java指令 。
f[Ljava/lang/String;)V;
myfunc; (I)1: SourceFile;
对象操作 扩展操作 保留指令
Oxb2——0xc3 0xc4——Oxc9 0xca——Dxfr
对象数据访 问或方 法调用 扩展索引长度 未用
样1 6=Utf8
mytes:t java
I软 件 研 发 与 应 用 j
S0FTW AREDEVELOPMENT&APPLiC盯 ION… … - … …… - .
。
public static int m yfunc(int); Code: 0=iload 0
一
1:iconst 1 一
2:iadd 3:ireturn
虽 然 Jaya语 言在语 法 上具 有复 杂多 样 的特点 ,但 Java虚 拟机更 多关 注 的是 Java源程序 经过 Java编 译器 产生 的结果一 类 (class)文件结 构。Java虚拟机 的整个 运作过程都是 围绕类 文件 展开的 ,每一个类 文件 对应一 个 Java源 文件 中定义 的类或接 口的二进 制表 示 。在类 文件 中既包含有类 源文件定义的字段 、方法 、实现 的接 口等信息 ,也包含 了虚拟 机运行所需要常量 池 、方法 的 局部变量表大小 、表达式栈 深度等信息 ,有关类 文件 的 描述见 2.2节 。 2.1 Java语 言
。
.
。
.
,
名 称 访问标志
字节数 2
池类 型在 Java虚拟机 规范标 准版 8中定 义 了 l4种 ,每 一 种类 型的详 细描述可参考规 范中的定义 ,上段 代码展
j 接口 I 字段
方 法 属 性
类索引 父类索引
接 口个数 接 口条 目 字段 个 数 字段条 目 方 法 个 数 方法条 目 属性个数 属性条 目
#3=Fieldref #1 9.#20: //java/lang/System.out:
//Ljava/io/PrintStream:
样4=Methodref #21.#22 //java/io/PrintStream.
//println:(I)V
#5= Class
#23: // mytest
HotsSpt,t JVM提供 两种解释执行方 式 :CPP斛释 不1】模 板斛释器 。CPP解释器利用编译 器编译的 c代码 解 释执 行 Java指 令 .模 板 解释器 在 虚拟机 初 始化 阶段 预 先为 每 一条 Java指 令动 态生成 机 器码 ,_ jt使 用这 些 产 , 的 机器码 来执 行 Java指 令 。模 板 解 释器不 仅 可 以解 释方J=I=执 行 Java代码 ,对 于频 繁调 用 的 Java函数还 会 编 成本地机器代码 ,以 接 函数 调用 的方式运行 . 此 ¨ Ht)tSpot默 认使Jlj的足模板解 释器 。 3.1 类 加 载
) ) 2.2 类 文 件 结 构
类 文件 是 由 Java编译 器生 成 的 、与操 作 系统 与硬 件 架构 无关 的 、对 Java源 义件 的二 进 制描述 。类 义件 的结构 由 Java虚拟机规范严格 定 义.类 义件结 构如表 1 所 示 。
表 1 一 类文件 结构
名称
如 L所爪 代石t5,myfunc函数的功能将人参加 1后 返 旧 .经 编 译 对应 的 Java指令有 4条 ,iload_O指 令将 局部 变 啦 笫 一个 元素 作 为整 型数据 加载 到操 作 数 栈 顶 ,即将 人参 入栈 ,ieosni一1指 令将 整数 1存人操 作 数 栈 顶 ,iadd指 令将 操作 数栈 顶 的 前两 个整 数 弹 H{并 相 JJll,Jf 将结果放入操作 数栈 ,ireturn指令将栈 顶整 型数 据 弹… 3t:返 给渊用者 、 3 模 板 解 释 器
2 2 2 可变 2 可 变 2 可变 2 可变
示 了Java示例代码对应 类文件 中的部分常量池 信息 。常 量 池的引用会 出现在编译 后方 法的字节码 中 ,每一个 方 法的描述对应一个方法 条 目。方法条 目和字段 条 目根据 其 包含属性信息 的不 同 ,条 目大小有所差 异。有关属性 信息的详细说 明请参考 虚拟机 规范 。 2.3 Java指 令 集
从类 的文件结 构可知 ,Java源文件 中的方法或 函数 通过类文件结构 中的方法信息描述 ,每一个非抽象 方法 条 目会拥有一 个 Code属性 ,包含该 方法对 应 的 Java指
public class m ytest
SourceFite: mytest.java。
m inOr version:0
public class mytest {
public static void main(String[】args) {
int a= myfunc(1): System .out.println(a); ) public static int myfunc(int P) f
return p+l:
Java虚 拟机解释执行 机制研 究
王 克伟 。胡 立 东 (江苏省车辐 中等专业学校 ,江苏 徐州 221344) 摘 要 :以广泛使 用的 Java虚拟机 实现一 HotSp0t JVM 为研 究对 象,探 讨 了 Java虚拟机 解释执 行的一般 原理 和 内在机制 。 目的在 于揭 示 Java程序在 虚拟机 上的执行 过程 ,激 发广 大计 算机研 究人 员和从 业者 对底层技 术的研 究兴趣 ,从 而更好地 掌握 计算机技术和使 用计算机 工具 关键词 :Java语言 ;虚拟机 ;解释器
表 2 Java指令分类
分类 常量操 作 加 载操 作 存储 操作 栈操作 算数操作 转换操 作 比较操 作 控 制 操 作
字节 码 0x0 —0x14 0xl5——Ox35 0x36.—0x56 0x57—Ox5f 0x6(卜 Dx84 0x85—-Ox93 0x94——0xa6 Oxa7——Oxb1
述 、字段 信息描 述 、方法信 息描述 、类 属性信 息描述 。
常量 池信息描述部 分 由常量池个数 字段确定常量 池条 目 的数 量 ,每个常量池 条 目根据其类 型确定其大小 .常量
9:jnvokevirtuaI槲 : 12:return
、 兰/ "/  ̄电-20啊18.0技9 与
(1)加载 :将类文件 中的类信息加载到 内存 中。 (2)验 证 :执 行 必要 的类 信 息 的正确 性 、合 法 性 校 验 .. (3)准备 :为类变量 分配空 间并准备好虚 函数 表和 接 口方法表 ,为类访问做好准备 。 (4)解析 :将常量池 中对类 、方法 、字段 的符号引 用 解析 为对应 的内存地址 。 (5)初始化 :执行类初始化 函数 。 3.2 指令模板 指 令模板 是指 为 每一 条 Java指令 生成 一小 段 本地 代码 .并 以字节码 为索引将这些 本地代码 的地 址保存在 一 维 数组 中。 当执 行一 个 Java函数 时 ,以 当前 Java函
讨论模板解释器的运作原理之前 .首先说 明一下 类 的加载过程 。类加载是指将类 信息从 文件形式描述 转 换 成 内存形式描述 .并为类 的使用 和访 问做好 准备 .类 的加载过程包括加载 、链接 、初 始化 3个 阶段 。其 rtl链 接 过 程 义包 括验 证 、准备 、解 析 (可选 )3个子 阶段 。 各 阶段的简单描述如下 :
样6=Class
#24: //java/lang/Object
#7 = Utf8
<init>:
#8 = Utf8
()V:
#9 = Utf8
Code;
#1 0 = Utf8
LineNum berTable;
#1 1= Utf8
main;
令 序列 。Java指令 集是 由 Java虚拟 机规 范 定 义的 、具 有 固定 指令 个 数和 语义 的字节 码 序列 。通 常 一 条 Java 指令 对应单个字节 ,即只含有操 作码 ,操作数 默认使用 表 达 式栈 的栈 顶 数据 ,部 分 Java指 令 对 应 多个 字节 , 即含有操 作码和操作数两部分 ,操作数根据操 作码 的不 同而有所区别 ,对于加载存储类 指令 ,操作数 通常是局 部 变量 表 的索 引 。Java指令 集 的分类 以及 Java示例 代 码对应 的字节码如表 2所示 。
样1 7= NameAndType #7:}}8: // ”<init>“:0V
样1 8= NameAndType 襻1 3:挣1 4: // myfunc:(I)l
由表 1可以看 出 ,类 文件结构 主要 由以下几 部分构
成 :类基 本信 息 描述 、常 量池 信息 描 述 、接 1:3信 息 描
描 述 将各类常 最值放人栈 从 LvT或数组 加载数据到栈 将 栈数据存储到 LVT或数组
栈顶数据复制 基本类型 的算数运算 各类 型数 据之间的转换 栈 顶数据比较控制指令转移
指令返 回或跳转
#1 2=Utf8
#13 = Utf8 样14= Utf8 #1 5 = Utf8
Maslc(魔数 )
版本 号
次版本号 主版本号
常量池
常量池 个数 常量池条 目
字节数 4 2 2 2
可变
收稿 日期 :2018—06—19
…
. , . …
。 。 . 。
。
。
。
…
…
…
…Baidu Nhomakorabea
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
…
实 用第一 智慧 密集
.
.
Java源 程序 是按 照 Java语 法编 写 的表达 特 定 功能 的一段代码 。与 c或 c++语言相 比 ,Java语 言的优势在 于其提供 了丰富的类 库支持 、 自动化 的内存 管理 、跨平 台执行等特性 。Java源程序 可以看作是 由众多类组 成 的 集合 ,编写 Java代码是实 质上是 在编写不 同的 Java类 。 以下是 一个 简单 的 Java类 的定 义 ,更 详细 的 Java程序 编写规则可 以参考 Java语 言规范。
major version:50
flags:ACC PUBLIC,ACC SUPER
—
—.
Constant pool:
祥1=Methodref 桶 .撑1 7: //java/lang/Object."<
finit>“:()V
样2= Methodref #5.撑1 8: //mytest.myfunc:(I)1
l 概 述 目前 ,Java已经 是世界上最流行 的语言之一 ,广 泛
应 用于互联 网 、企业 网 、嵌入式设备 等众多领 域 Java 流行 的一个 重要原 因得益 于 Java程序 跨平 台执行 的优 势 , 即 一 次 编 译 后 可 以 在 任 何 安 装 有 Java虚 拟 机 (JVM)的机 器上 运行 。虽然 Java程序 是平 台无 关 的 . 但 Java虚拟 机 却是 平 台相 关 的 。在 某 种意 义 上 .Java 语 言使 用上 的简便 性是建 立 在 Java虚 拟 机实现 的 复杂 性 的基础 之 上的 。探 讨 的 Java虚拟机 解 释执 行机 制是 Java官方 采用 的 HotSpot JVM。在 Intelx86 32位 CPU架 构下 的实现 。 2 解释执行基础
如 下所示 的 Java示 例代 码 只包含 了两 个 简单 的静
态方法的定义 ,其 中 main方法 为 Java程序的人 口方法 , 包含 main方法的类 为启 动类 、在 Java虚 拟机 开始执行 main方 法时 ,Java启动代码 (Java命令 )先将 动类加 载到虚 拟机 中 ,再找 到 main方 法 的对应 的信息 ,最后 通 过特 定 的接 [】(Java Native Interfaee)调用 跳转 到虚 拟机 中执行 main方法对应 的 Java指令 。
f[Ljava/lang/String;)V;
myfunc; (I)1: SourceFile;
对象操作 扩展操作 保留指令
Oxb2——0xc3 0xc4——Oxc9 0xca——Dxfr
对象数据访 问或方 法调用 扩展索引长度 未用
样1 6=Utf8
mytes:t java
I软 件 研 发 与 应 用 j
S0FTW AREDEVELOPMENT&APPLiC盯 ION… … - … …… - .
。
public static int m yfunc(int); Code: 0=iload 0
一
1:iconst 1 一
2:iadd 3:ireturn
虽 然 Jaya语 言在语 法 上具 有复 杂多 样 的特点 ,但 Java虚 拟机更 多关 注 的是 Java源程序 经过 Java编 译器 产生 的结果一 类 (class)文件结 构。Java虚拟机 的整个 运作过程都是 围绕类 文件 展开的 ,每一个类 文件 对应一 个 Java源 文件 中定义 的类或接 口的二进 制表 示 。在类 文件 中既包含有类 源文件定义的字段 、方法 、实现 的接 口等信息 ,也包含 了虚拟 机运行所需要常量 池 、方法 的 局部变量表大小 、表达式栈 深度等信息 ,有关类 文件 的 描述见 2.2节 。 2.1 Java语 言
。
.
。
.
,
名 称 访问标志
字节数 2
池类 型在 Java虚拟机 规范标 准版 8中定 义 了 l4种 ,每 一 种类 型的详 细描述可参考规 范中的定义 ,上段 代码展
j 接口 I 字段
方 法 属 性
类索引 父类索引
接 口个数 接 口条 目 字段 个 数 字段条 目 方 法 个 数 方法条 目 属性个数 属性条 目
#3=Fieldref #1 9.#20: //java/lang/System.out:
//Ljava/io/PrintStream:
样4=Methodref #21.#22 //java/io/PrintStream.
//println:(I)V
#5= Class
#23: // mytest
HotsSpt,t JVM提供 两种解释执行方 式 :CPP斛释 不1】模 板斛释器 。CPP解释器利用编译 器编译的 c代码 解 释执 行 Java指 令 .模 板 解释器 在 虚拟机 初 始化 阶段 预 先为 每 一条 Java指 令动 态生成 机 器码 ,_ jt使 用这 些 产 , 的 机器码 来执 行 Java指 令 。模 板 解 释器不 仅 可 以解 释方J=I=执 行 Java代码 ,对 于频 繁调 用 的 Java函数还 会 编 成本地机器代码 ,以 接 函数 调用 的方式运行 . 此 ¨ Ht)tSpot默 认使Jlj的足模板解 释器 。 3.1 类 加 载
) ) 2.2 类 文 件 结 构
类 文件 是 由 Java编译 器生 成 的 、与操 作 系统 与硬 件 架构 无关 的 、对 Java源 义件 的二 进 制描述 。类 义件 的结构 由 Java虚拟机规范严格 定 义.类 义件结 构如表 1 所 示 。
表 1 一 类文件 结构
名称
如 L所爪 代石t5,myfunc函数的功能将人参加 1后 返 旧 .经 编 译 对应 的 Java指令有 4条 ,iload_O指 令将 局部 变 啦 笫 一个 元素 作 为整 型数据 加载 到操 作 数 栈 顶 ,即将 人参 入栈 ,ieosni一1指 令将 整数 1存人操 作 数 栈 顶 ,iadd指 令将 操作 数栈 顶 的 前两 个整 数 弹 H{并 相 JJll,Jf 将结果放入操作 数栈 ,ireturn指令将栈 顶整 型数 据 弹… 3t:返 给渊用者 、 3 模 板 解 释 器
2 2 2 可变 2 可 变 2 可变 2 可变
示 了Java示例代码对应 类文件 中的部分常量池 信息 。常 量 池的引用会 出现在编译 后方 法的字节码 中 ,每一个 方 法的描述对应一个方法 条 目。方法条 目和字段 条 目根据 其 包含属性信息 的不 同 ,条 目大小有所差 异。有关属性 信息的详细说 明请参考 虚拟机 规范 。 2.3 Java指 令 集
从类 的文件结 构可知 ,Java源文件 中的方法或 函数 通过类文件结构 中的方法信息描述 ,每一个非抽象 方法 条 目会拥有一 个 Code属性 ,包含该 方法对 应 的 Java指
public class m ytest
SourceFite: mytest.java。
m inOr version:0
public class mytest {
public static void main(String[】args) {
int a= myfunc(1): System .out.println(a); ) public static int myfunc(int P) f
return p+l: