本书整合了自1999年《Java虚拟机规范(第2版)》发布以来Java世界所出现的技术变化。另外,还修正了第2版中的许多错误,以及对目前主流Java虚拟机实现来说已经过时的内容。最后还处理了一些Java虚拟机和Java语言概念的模糊之处。
针对本书,读者有任何勘误或模糊之处,均可发邮件到jvms-comments-ww@oracle.com。
2004年发布的Java SE 5.0版为Java语言带来了翻天覆地的变化,但是对Java虚拟机设计的影响则相对较小。在Java SE 7这个版本中,我们扩充了class文件格式以便支持新的Java语言特性,譬如泛型和变长参数方法等。
2006年发布的Java SE 6.0版看起来并没有为Java语言带来什么新的变化,但是对Java虚拟机的影响就比较大。如新的字节码验证方式,它源于Eva Rose的一篇硕士论文,文中以Java Card平台为背景,展示了Java虚拟机字节码验证的另一种全新的实现思路。这促进了Java ME CLDC第1版实现的诞生,并最终成为Java SE平台class验证过程的理论基础。关于这部分内容将会在第4章中介绍。
Sheng Liang实现了Java ME CLDC的验证器。Gilad Bracha负责对该验证器做出详细说明,Antero Taivalsaari则是整个Java ME CLDC规范的负责人。Alessandro Coglio在字节码验证的分析方面的工作对本规范做出了很大的贡献。Wei Tao、Frank Yellin、TimLindholm与Gilad Bracha一起实现的Prolog验证器是Java ME和Java SE平台规范的共同基础。Wei Tao后续继续实现了实际运用于Hot Spot Java虚拟机的验证器。之后Mingyao Yang改进了规范和设计,形成了Java SE 6中的最终实现版本。该规范成文得益于以下JSR 202专家组成员:Peter Burka、Alessandro Coglio、Sanghoon Jin、Christian Kemper、Larry Rau、EvaRose以及 Mark Stolz。
在2011年发布的Java SE 7平台终于兑现了在1997年《Java虚拟机规范》第1版中就已做出的承诺:“在未来,我们会对Java虚拟机进行适当扩展,以便更好地支持其他语言运行于JVM之上。”Gilad Bracha的工作是开发Java虚拟机中的热替换(hotswapping)功能,以及在Java虚拟机静态类型系统上支持动态类型语言实现。invokedynamic指令以及支持这个指令的基础架构由John Rose以及JSR 292专家组成员:Ola Bini、 Rémi Forax、Dan Heidinga、Fredrik ?hrstr?m、JochenTheodorou进行开发。还有Charlie Nutter和Christian Thalinger做出了特别贡献。
还有许多人的名字应当出现在这里,他们在不同时间段对Java虚拟机的设计和实现做出过贡献。我们今天所见的Java虚拟机拥有卓越的执行性能,这离不开DavidUngar和他的同事们在Sun实验室Self项目中所积累的技术基础。这些技术最初用于Self语言,后来形成了Animorphic Smalltalk虚拟机,经过长期而曲折的发展,最终成为今天Oracle HotSpot JVM的技术基础。Lars Bak和Urs H?lzle经历了所有上述的技术发展阶段,对于今天的Java虚拟机能够拥有大家认为理所当然的高效执行性能,他们实在是居功至伟。
本规范中很多意义深远的改进来自于Martin Buchholz、Brian Goetz、Paul Hohensee、David Holmes、Karen Kinnear、Keith McGuigan、Jeff Nisewanger、 Mark Reinhold、Naoto Sato、BillPugh、Uday Dhanikonda、Janet Koenig、AdamMessinger、John Pampuch、Georges Saab和Bernard Traversat所作出的贡献。Jon Courtney和Roger Riggs帮助我们保证此规范的内容可同时适用于Java ME和Java SE平台。Leonid Arbouzov、Stanislav Avzan、Yuri Gaevsky、Ilya Mukhin、Sergey Reznick和Kirill Shirokov在Java技术兼容包(JavaCompatibility Kit,JCK)上作出了卓越贡献,以保证本规范中描述的内容是可测试并且已测试的。
Gilad Bracha
Los Altos,California
Alex Buckley
Santa Clara,California
第2版前言
《Java虚拟机规范(第2版)》将规范所描述内容的技术背景升级到了Java 2平台(JDK 1.2),它还包括了许多对第1版的修正,并且在不改变规范内容逻辑的情况下,使描述变得更加清晰。我们也尝试调整了规范中的字体样式、勘误(希望勘误不会产生新的错误)以及对规范中模糊的部分增加额外的描述。另外,我们还修正了许多《Java虚拟机规范》和《Java语言规范》之间不一致的内容。
我们很感谢所有为我们梳理过第一版规范并指出问题的读者,特别感谢以下个人和团体,他们指出了问题甚至直接提供了修改意见。
Carla Schroer与她在加利福尼亚州古本蒂诺、俄罗斯新西伯利亚的兼容性测试团队(尤其感谢其中的Leonid Arbouzov和AlexeiKaigorodov)。他们煞费苦心地为第1版中各处可测试的场景编写了兼容性测试用例。在这个过程中,他们还发现了许多处第1版规范中不清晰和不完整的内容。Jeroen Vermeulen、Janice Shepherd、Peter Bertelsen、Roly Perera、JoeDarcy与Sandra Loosemore提交了许多有用的建议和反馈,这些建议和反馈对于第2版规范的改进工作有很大帮助。Addison Wesley Longman出版社的编辑Marilyn Rash和Hilary Selby Polk帮助我们在第2版中合并技术变更的同时,改进了规范的可读性和内容的布局排版。
还要特别感谢Gilad Bracha,他对本书出版进行了严格审查,另外他也是本书新增内容的主要贡献者,尤其是第4、5章。他对计算机理论的贡献以及他解决的《Java虚拟机规范》和《Java语言规范》之间的描述差异问题都极大地完善了本书。
Tim Lindholm
Palo Alto,California
Frank Yellin
.Redwood City,California
1999年4月
第1版前言
《Java虚拟机规范》是描述Java虚拟机设计原理的一份完整的规范文档。这份文档对于任何一个希望实现Java虚拟机的编译器作者,或者希望实现一个与规范兼容的Java虚拟机的程序员来说都是必不可少的。
Java虚拟机是一个抽象化的机器,整个规范中提及的Java虚拟机都是抽象化的概念,而不是特指Oracle或者其他某一家公司的Java虚拟机实现。本书与一个具体的虚拟机实现之间的关系就犹如一份建筑蓝图与一间具体的房屋之间的关系一样。Java虚拟机具体实现(包括任何公司的JVM实现)必须包括本规范所描述的内容,但是除了少数绝对必要的地方外,本规范中的描述不应成为Java虚拟机具体实现的束缚。我们希望这个规范至少能作为一个“实验室”版本的虚拟机实现的完整描述。
Java虚拟机源于由James Gosling在1992年设计,用于支持Oak程序语言的虚拟机。在Java虚拟机的发展历程中,Sun公司的Green项目、FirstPerson公司、LiveOak项目、Java产品组、JavaSoft公司以及今天的Oracle公司的Java平台组中许多人都作出了直接或间接的贡献。
这本书最初是源于由Kathy Walrath编著的一份公司内部文档。Mary Campione将本书转换为HTML版本,使大家可通过互联网访问到本书。
《Java虚拟机规范》的诞生离不开Java产品团队的总经理Ruth Hennigar的大力支持,还有编辑Lisa Friendly、Mike Hendrickson以及他在Addison-Wesley出版社的团队所做出的编辑工作。在此特别感谢Richard Tuck对原稿的仔细审查,还有Bill Joy对本书的审查、评价和指导意见,这些宝贵信息对本书定稿都有很大的帮助。
Tim Lindholm
Palo Alto,California
Frank Yellin
Redwood City,California
1996年6月
《java虚拟机规范(java se 7版)》
译者序
前言
第2版前言
第1版前言
第1章 引言1
1.1 简史1
1.2 java虚拟机2
1.3 各章节摘要2
1.4 说明3
第2章 java虚拟机结构4
2.1 class文件格式4
2.2 数据类型5
2.3 原始类型与值5
2.3.1 整数类型与整型值6
2.3.2 浮点类型、取值集合及浮点值6
2.3.3 returnaddress类型和值8
2.3.4 boolean类型8
2.4 引用类型与值9
2.5 运行时数据区9
.2.5.1 pc寄存器9
2.5.2 java虚拟机栈9
2.5.3 java堆10
2.5.4 方法区11
2.5.5 运行时常量池11
2.5.6 本地方法栈11
2.6 栈帧12
2.6.1 局部变量表13
2.6.2 操作数栈13
2.6.3 动态链接14
2.6.4 方法正常调用完成14
2.6.5 方法异常调用完成15
2.7 对象的表示15
2.8 浮点算法15
2.8.1 java虚拟机和ieee 754中的浮点算法15
2.8.2 浮点模式16
2.8.3 数值集合转换16
2.9 特殊方法17
2.10 异常18
2.11 字节码指令集简介20
2.11.1 数据类型与java虚拟机21
2.11.2 加载和存储指令23
2.11.3 算术指令23
2.11.4 类型转换指令24
2.11.5 对象创建与操作26
2.11.6 操作数栈管理指令26
2.11.7 控制转移指令27
2.11.8 方法调用和返回指令27
2.11.9 抛出异常28
2.11.10 同步28
2.12 类库28
2.13 公有设计,私有实现29
第3章 java虚拟机编译器30
3.1 示例的格式说明30
3.2 常量、局部变量和控制结构的使用31
3.3 算术运算35
3.4 访问运行时常量池35
3.5 更多控制结构示例36
3.6 接收参数39
3.7 方法调用39
3.8 使用类实例42
3.9 数组43
3.10 编译switch语句45
3.11 使用操作数栈46
3.12 抛出异常和处理异常47
3.13 编译finally语句块50
3.14 同步53
3.15 注解54
第4章 class文件格式55
4.1 classfile结构56
4.2 各种内部表示名称60
4.2.1 类和接口的二进制名称60
4.2.2 非全限定名60
4.3 描述符和签名61
4.3.1 语法符号61
4.3.2 字段描述符61
4.3.3 方法描述符63
4.3.4 签名63
4.4 常量池66
4.4.1 constant_class_info结构67
4.4.2 constant_fieldref_info、constant_methodref_info和constant_interface methodref_info结构67
4.4.3 constant_string_info结构69
4.4.4 constant_integer_info和constant_float_info结构69
4.4.5 constant_long_info和constant_double_info结构70
4.4.6 constant_nameandtype_info结构71
4.4.7 constant_utf8_info结构72
4.4.8 constant_methodhandle_info结构74
4.4.9 constant_methodtype_info结构74
4.4.10 constant_invokedynamic_info结构75
4.5 字段75
4.6 方法77
4.7 属性80
4.7.1 自定义和命名新的属性81
4.7.2 constantvalue属性81
4.7.3 code属性82
4.7.4 stackmaptable属性85
4.7.5 exceptions属性91
4.7.6 innerclasses属性92
4.7.7 enclosingmethod属性94
4.7.8 synthetic属性94
4.7.9 signature属性95
4.7.10 sourcefile属性96
4.7.11 sourcedebugextension属性96
4.7.12 linenumbertable属性97
4.7.13 localvariabletable属性98
4.7.14 localvariabletypetable属性99
4.7.15 deprecated属性101
4.7.16 runtimevisibleannotations属性101
4.7.17 runtimeinvisible annotations属性105
4.7.18 runtimevisibleparameter annotations属性106
4.7.19 runtimeinvisibleparameter annotations属性107
4.7.20 annotationdefault属性108
4.7.21 bootstrapmethods属性108
4.8 格式检查110
4.9 java虚拟机代码约束110
4.9.1 静态约束110
4.9.2 结构化约束113
4.10 class文件校验115
4.10.1 类型检查验证116
4.10.2 类型推导验证178
4.11 java虚拟机限制184
第5章 加载、链接与初始化186
5.1 运行时常量池186
5.2 虚拟机启动188
5.3 创建和加载188
5.3.1 使用引导类加载器来加载类型190
5.3.2 使用用户自定义类加载器来加载类型190
5.3.3 创建数组类191
5.3.4 加载限制191
5.3.5 从class文件表示得到类192
5.4 链接193
5.4.1 验证194
5.4.2 准备194
5.4.3 解析195
5.4.4 访问控制201
5.4.5 方法覆盖201
5.5 初始化202
5.6 绑定本地方法实现203
5.7 java虚拟机退出203
第6章 java虚拟机指令集204
6.1 设定:“必须”的含义204
6.2 保留操作码204
6.3 虚拟机错误205
6.4 指令描述格式205
6.5 指令集描述207
第7章 操作码助记符293
附录a limited license grant300
本书作者MontyNeworn是国际计算机象棋协公的主席,作者是用生动活泼的笔触描写了深蓝与卡斯帕罗夫之战这一引起全世界关注的历史事
Pro/ENGINEER中文野火版4.0高级应用教程-(含1CD) 本书特色 高级工具、装配高级功能、高级渲染。isdx曲面行为建模、机构与运动仿真、动画、逆向...
Inlife,uncertaintysurroundsus.Thingsthatwethoughtweregoodforusturnouttobebadforu...
《新手易学:中文版Photoshop CS5图像处理》内容简介:《新手易学:中文版Photoshop CS5图像处理》是为帮助Photoshop初级用户掌握Ph
《微商引流爆粉实战手册:全网引流实战300招》内容简介:本书整体上以平台选择为逻辑主线,向读者推荐了诸多引流方法:集赞引流、微
《Photoshop修片,超简单!》内容简介:这是一本学习起来“超简单”的修片实用教程。本书以案例为主导,以新颖的写作形式介绍了包括
《神经网络模型及其MATLAB仿真程序设计》重点介绍了MATLAB6.5神经网络工具箱中各种神经网络模型及基本理论,以及各种神经网络模型
《CG思维解锁》内容简介:本书是国内首部介绍新科技时代下综合运用CG绘图技术进行数字绘画创作的著作。本书内容涉及自动绘画、VR36
深入浅出玩转FPGA-第2版-含光盘 本书特色 《深入浅出玩转fpga(第2版)》收集整理了作者在fpga学习和实践中的经验点滴。书中既有日常的学习笔...
《中国零售业发展监测与分析报告(2017)》内容简介:中国零售业担负着商品流通和实现城乡居民消费的重任,是国民经济的支柱性产业
《人生三舍》内容简介:本书是关于探索人生哲学的通俗读物。本书包括了把过程当作一种享受;直的不行就绕个弯;宽广胸襟,无忧也无
郝柏林,1934年6月生于北京市。1959年毕业于乌克兰国立哈尔科夫大学物理数学系。后在中国科学院物理研究所工作。1978年晋升为研究
《战火中的大学:从陕北公学到人民大学的回顾》内容简介:本书作者成仿吾是新文化运动的代表、中国共产党内著名的无产阶级教育家、
AuthoritativebutaccessibleinformationonJavaprogrammingfundamentalsAsoneofthemost...
CCNP实战指南:远程接入 本书特色 本书适用于想要通过CCNP远程接入书面考试的网络技术人员,以及那些希望获得实际经验以轻松应付日常工作的人。由于本书既包括了...
《软件调试实战》主要讲述C/C++程序的调试和分析,书中的调试技术也可以应用于其他语言编写的程序。《软件调试实战》在讲述简单的
《上行:可复制的突围之道》内容简介:《认知突围》作者、百万级畅销作家蔡垒磊励志新作 打破成功之路的拥挤错觉,打造向上生长的无
本书主要讲述采用正交频分复用(OFDM)技术的宽带通信技术及其在WLAN中的应用,具体内容包括发展背景和OFDMWLAN的概况;OFDM网络中
新连接:互联网+产业转型,互联网+企业变革 本书特色 当前正处于信息通信技术飞速发展和社会经济面临转型的关键时期,有人兴奋,有人焦虑;有人坚定前行,有人迷茫失措...
这是一本非常棒的书,主要讲解如何用Photoshop处理图片和做商业设计。《抠图+修图+调色+合成+特效Photoshop核心应用5项修炼》以案