本书共分20章,第1-4章解释了Java虚拟机的体系结构,包括Java栈、堆、方法区、执行引擎等;第5-20章深入描述了Java技术的内部细节,包括垃圾收集、Java安全模型、Java的连接模型和动态扩展机制、class文件、运算及流程控制等等,其中第6章和附录A-C安全可以作为class文件和指令集的参考手册。本书还附带光盘,光盘中包含用以辅助说明正文内容的交互式例示applet及示例源代码。
译者序\r\n前言\r\n第1章 Java体系结构介绍\r\n第2章 平台无关\r\n第3章 安全\r\n第4章 网络移动性\r\n第5章 Java虚拟机\r\n第6章 Java class文件\r\n第7章 类型的生命周期\r\n第8章 连接模型\r\n第9章 垃圾收集\r\n第10章 栈和局部变量操作\r\n第11章 类型转换\r\n第12章 整数运算\r\n第13章 逻辑运算\r\n第14章 浮点运算\r\n第15章 对象和数组\r\n第16章 控制流\r\n第17章 异常\r\n第18章 finally子句\r\n第19章 方法的调用与返回\r\n第20章 指令invokespecial\r\n第21章 线程同步\r\n附录A 按操作码助记符排列的指令集\r\n附录B 按功能排列的操作码助记符\r\n附录C 按操作码字节值排列的操作码助记符\r\n附录D Java虚拟机的一个模拟:“Slices of Pi”
Bill Venners有14年编写软件专著的经验。他在硅谷的Artima软件公司提供软件咨询和培训服务。自1996年以来,他已经编写了40多篇有关Java技术的文章。他在《Java World杂志》辟有热闹专栏,介绍Java内部细节、面向对象设计技术和Jini技术。他还是artima.com的作者和网站管理员、这是Java和Jini开发者的一个在线资源站点。他在全世界范围举办内部培训和公开的研究报告,有时也在软件会议上进行Java技术讲演。
我写本书的主要目的是向Java程序员解释Java虚拟机——包括几个和虚拟机紧密相关的核心Java API。虽然Java虚拟机使用了许多有效技术——这些技术已在Java语言中被尝试和证明过,但共中采用的很多技术还没有被普遍使用。因此很多程序员在开始使用Java编程的时候,都感觉是第一次接触这些技术。垃圾收集、多线程、异常处理、动态扩展,甚至使用虚拟机本身,这些对于很多程序员来说都是全新的。本书的目的是为了帮助程序没理解这些东西的工作方式,并在这个过程中帮助他们更加适应用Java编程。
编写本书的另外一个目的是为了试验改变文本的意义。网页有三个有趣的特性,这些特性使得它们和纸质文本有所区别:它们是动态的(可以随时间变化),它们是交互式的(特别是在上面嵌入Java applet后),还有,它们是相互链接的(可以很容易地在它们之间漫游)。除了传统和文本和图表,本书还包括几个Java applet(在随书光盘给出的迷你Web站点中),用它们作为交互式例示以补充文中所述概念。除此之外,我还在Internet上维护一个Web网站 artima.com,读者可以以此为起点找到与本书主题有关的更多、更新的参考资料。本书的构成包括文本、图表、交互式例示,还有网上链接,这样做的目的是为了方便读者深入阅读。
本书讲述了Java虚拟机——运行所有Java程序的抽象计算机,还讲了几种与虚拟机密切相关的核心Java API。本书通过分析讲解、可运行的示例、参考资料和applet(它作为文中所述概念的交互式例示),提供了Java技术的深入概览。
Jaya编程语言似乎将要成为继C和C++之后的下一门流行的主流商业软件开发语言,之所以这样的一个基本原因是,Java的体系结构能帮助程序员适应发展的硬件环境,Java具有在硬件环境中按照要求切换的特性,这都是由Java虚拟机提供的能力。
编程语言革命由硬件的发展所推动(当然还有更多推动力)。硬件在飞速发展,变得更加廉价且功能更加强大,软件变得越来越庞大、越来越复杂。从汇编语言到结构化语言的转变(比如C),以及到面向对象语言的转变(比如C++),在很大程度上是为了满足管理更高复杂度软件的需要——不断强大的硬件使得复杂度可能更高。
今天,获得更廉价、更快速、更强大硬件的势头仍在继续,软件复杂度不断增长的势头也在继续。在C和C++基础上,Java帮助程序员解决了一些复杂性,因为一些在C和C+十中常见的固定类型的bug不再存在了。Java与生俱来的内存安全性一一垃圾收集、取消了指针算法、在使用引用的时候进行运行时检查,避免了可能曾出现在Java程序中的大多数内存bug。 Java的内存安全性使程序员生产效率更高,并在复杂度管理方面给他们提供了帮助。
除了持续增长的硬件能力之外,另外一个基础的硬件环境变化就是网络。网络把越来越多的计算机和设备连接起来,对软件提出了新的要求。随着网络的兴起,平台无关性和安全性也变得更加重要了。
Java虚拟机负责Java程序设计语言的内存安全、平台无关和安全特性。虽然虚拟机在Java之前已经出现一段时间了,但是没有进入主流。然而,在今天不断变化的硬件环境现实面前,软件开发者需要一种使用虚拟机的编程语言。Sun用Java打开了这个市场的窗口。
也就是说,Java虚拟机为未来数年装备了正确的软件特性。本书会帮助读者理解Java虚拟机以及密切相关的几种Java API。有了这些知识,再通过自己的努力,就能使Java独一无二的体系结构发挥出更大的效能。
本书读者对象
本书主要是针对想了解Java技术的专业软件开发者和学生编写的。我假设读者对Java语言已经比较熟悉(但不需要精通),阅读本书会帮助读者深入理解Java编程知识。如果你是编写Java编译器或者编写Java虚拟机实现的少数精英之一,本书可以看作是对Java虚拟机规范的补充,书中对规范做出了解释。
如何使用本书
本书由五个部分组成:
1) 对Java体系结构的介绍(第1~4章)。
2) Java内部细节的深入技术教程(第5~20章)。
3) class文件和指令集的索引参考(第6章和附录A~C)。
4) 交互式例示和示例源代码(在随书光盘中)。
5) 资源页(http://www.aroma.com/insidejvm/resources/)。
对Java体系结构的介绍
第1~4章(本书的第一部分)给出了Java体系结构的总览,包括隐藏在Java体系结构设计背后的动机。这几章展示了Java虚拟机是如何与Java体系结构的其他组成部分(class文件、API和编程语言)相互关联的。如果想对Java技术有一个基础的了解,请阅读这些章节。下面是这部分的提要。
第1章“Java体系结构介绍”,在Java体系结构的概览和内部细节讨论上做了合理取舍。
第2章“平台无关”,讨论了平台无关的确切含义,Java体系结构是如何支持这个特性的,以及创建平台无关的Java程序的步骤。
第3章“安全”,描述了Java核心体系内置的安全模型,包含一个经精心制作的、可运行的例子,该例子示范了1.2版Java安全框架中的细粒访问控制的好处。
第4章“网络移动性”,讨论了网络移动软件的新范型。
Java内部技术教程
第5~20章(本书的第二部分)给出了Java虚拟机和相关核心Java API内部工作的深入技术描述,这些章节会帮助读者理解Java程序的实际运作情况。第二部分内容按照教程的方式组织,有很多示例。下面是这部分的提要。
第5章“Java虚拟机”,给出了对Java虚拟机内部工作的全面概览。
第6章“Java class文件”,是一份关于class文件格式的完整的教程和参考。如果你正在解析、生成或者比较关注Javaclass文件,那么这一章非看不可。
第7章“类型的生命周期”,讨论了类在Java虚拟机中的完整的生命周期,包含类被卸载的环境。
第8章“连接模型”,完整解释了Java的连接模型,包括使用forName()和类装载器的例子,以便在运行时用新类型对Java应用程序进行动态扩展。
第9章“垃圾收集”,讨论了垃圾收集和终结(finalization),解释了什么是软、弱和影子引用,也提出了如何使用终结方法。
第10~19章是关于Java虚拟机指令集的教程。
第20章“线程同步”,解释了什么叫做监视器,以及如何使用它们编写线程安全的Java代码。
class文件和指令集参考
第6章除了作为Java class文件的教程之外,同时也是class文件格式的完整参考。同样,第10~20章构成了Java虚拟机指令集的教程,而附录A~C是指令集的完整参考。如果读者需要查阅有关指令的内容,请参见这些章节和附录。
交互式例示和示例源代码
本书的大多数章节在随书光盘上都找得到相关的材料——比如示例代码或者模拟applet。
随书光盘的applets目录中包含了一个叫做“Interactive Illustrations Web Site”的迷你Web网站,其中包含了15个Java applet,它们描绘了文中叙述的概念。这些交互式例示是本书的整体组成部分,其中11个applet模拟了Java虚拟机执行字节码,其他的演示了垃圾收集、二进制补码和IEEE 754标准的浮点数以及装载class文件的过程。这些applet可以在任何平台上、使用任何具有Java能力的浏览器浏览。这些模拟applet的源代码也包含在随书光盘上。
在“Interactive Illustrations Web Site”目录中的HTML,.Java和.class文件根据版权声明允许读者把它们张贴到网络上(包括Internet)——只是必须遵守一些简单的规则。比如,必须完整地张贴整个站点(不能做任何修改),并且不能向浏览这个站点的人收费。版权声明的全文会在下面给出。
随书光盘中所有的示例源代码都包含源代码形式和编译过的形式(class文件)。如果对文本中的某个例子有兴趣或感到好奇,可以自己试验一下。
大部分示例代码都是用于解释目的的,除了帮助读者理解Java之外没有什么实际价值。不管怎样,读者可以从示范代码中随意拷贝、粘贴,用在自己的程序中,或者用二进制形式(比如lavaclass文件)发布。关于示例源代码的版权声明的全文会在下面给出。
Java虚拟机资源页面
为了让读者了解更多的信启、,跟上时代的变化,我在artima.com维护一些页面,其中包含一些链接,指向与本书内容相关的阅读材料。这些链接页面的主页面是“Java虚拟机资源页面”,URL是http://www.artlma.com/insidejvm/resources/。