首页>参考读物>计算机科学与技术>软件与程序设计

深入Java虚拟机(原书第2版)
作者 : (美)Bill Venners
译者 : 曹晓钢 蒋靖
出版日期 : 2003-09-01
ISBN : 7-111-12805-2
定价 : 58.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 461
开本 : 16开
原书名 : Inside the Java 2 Virtual Machine
原出版社:
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

对本书第1版的赞誉
  作者卓有成效地深入解释了Java虚拟机(JVM)的内部工作原理,对这个错综复杂的软件中的许多部分都给出了可能的实现,这是对Sun的官方规范的精彩补充。
每一个概念都很清晰,一般都有例子作辅助说明。随书光盘中还包含了许多富有启发的示例,它们演示了虚拟机内部工作的情况。这本书得到虚拟机实现者的极高评价,相信任何有兴趣了解虚拟机核心部分的人都会获益匪浅。
  ——Antoine Trux,芬兰赫尔辛基诺基亚研究中心项目经理,《Java Report》杂志,1998年12月。《深入Java虚拟机》一书的作者因本书获《Java Report》杂志1998年优秀作者奖。
  在我钻研本书的结构和内容之前,我很高兴提到Venners的书给我印象最深刻的一点:对细节的全心关注和对内容的精确协调。
  从第5章到第20章都包含花很多心思编写的动态交互式applet,它们为每章的主题带来了活力。比如说垃圾收集这一章,不仅介绍了许多现代垃圾收集算法,还附带了一个“鱼堆”applet,让读者真正理解垃圾收集中的设计问题及可能的解决方案。
  简单地说,Venners的书是卓越的,是一本我必须推荐的书。
  ——Laurence Vanhelsuw e,《Java World杂志》,1998年3月感谢你写出这么优秀的书。我已经编写Java程序很多年了,这本书真的帮助我洞察了这门语言的内脏。再次为了美妙的阅读体验感谢你!
  ——Noah S.Frledland 博士
  最近购买了你的书,它比JVM规范易读、易懂多了!我还喜欢你的applet,它们让事情变得简明易懂。  ——Paul Bathen
  《深入Java虚拟机》这本书,是我所有Java图书收藏中编写得最好和最有帮助的书之一。  ——Louis Barton
  我刚刚读完你的《深入Java虚拟机》,感谢你富有帮助的工作!
  ——Antoine Trux
  一本关于Java虚拟机的详尽而系统的书。假如你准备开始编写自己的JVM,或者你对“在执行.class文件的时候究竟发生了什么事情”感兴趣的话,就必须拥有这本书。对所有读过Java虚拟机规范后还想寻找更多资料的人来说,这本书是受欢迎的、减轻痛苦的良药。  ——Gopal Ananthraman
  我真的在阅读你的书的时候感到愉悦。它有很多很好的内容,我觉得它们会使我成为更好的Java程序员。——Joel Nylund,美国管理系统公司
  我购买了一本《深入Java虚拟机》。虽然我只阅读了第7章和第8章,但我感到非常愉快,并且对中间的细节印象深刻。你回答了我所遇到的很多问题,包括“在调用ClassLoader.findSystemClass()的时候,在动态类装载器委派责任中,对于已装载的类,虚拟机会解释哪一个类装载器?”
  我以前在Lotus开发公司工作的时候,我与别人合作为Prentice-Hall写过一本叫做《深入Lotus Add-in 工具包》的书。我们讨论的技术和Java很相似——个平台中立的、拥有部分复杂性的语言(其字节码需要一个运行时虚拟机来执行)。
  作为作者,我们的目标是在描述整个技术的时候保持精确性和幽默感。我们在技术上花费了大量劳动,对精确性和技术细节特别关注——如同开发者一样,我们希望文章是有用的、正确的;如同读者一样,我们精通英语的用法,因为大部分流行的技术文章都不敢恭维。
  这些方面都是我对你的工作表示激赏的。当一个作者花时间来写完整的句子,采用通俗的语气,保持专业术语的一致性,并且提供真正有价值的内容,而不仅仅是重复公开的规范(通常还是不精确的),我向这样的作者致敬。 ——David McCall
  如果你真的希望揭开Java的面纱,这是最好的Java书。如果你真的希望了解JVM的输入输出,《深入Java虚拟机》是一本值得敬畏的著作。我被作为技术作家的Bill先生的能力打动了,对任何认真的Java开发者,如果想深入理解Java,我强烈推荐这本书。  ——Rashid Jilani,发表于AMAZON.COM
  一本伟大的书。
  这是我到目前为止读过的最好的Java书。Bill是一个伟大的软件工程师,也是作家。如果你希望了解JVM的内幕,这本书是必不可少的。
  ——Michael Young,发表于AMAZON.COM
  本书作者曾因本书荣获专业技术杂志《Java Report》评选的优秀作者奖,细心的读者可以从网上找到许多对本书第1版的赞誉。
  作者以易于理解的方式深入揭示了Java虚拟机的内部工作原理,深入理解这些内容,将对读者更快速地编写更高效的程序大有裨益!
  本书共分20章,第1~4章解释了Java虚拟机的体系结构,包括Java栈、堆、方法区、执行引擎等;第5~20章深入描述了Java技术的内部细节,包括垃圾收集、Java安全模型、Java的连接模型和动态扩展机制、class文件、运算及流程控制等等,其中第6章和附录A~C完全可以作为class文件和指令集的参考手册。本书还附带光盘,光盘中包含用以辅助说明正文内容的交互式例示applet及示例源代码。
  本书深入详细地介绍了Java体系结构及其内部细节,了解这些内容才能更快速地编写更高效的程序!理解了Java虚拟机,深入细致地了解了Java技术的底层,才能使自己的程序充分发挥Java技术的优势!
  本书详细解释了JVM的体系结构,包括Java栈、堆。方法区和执行引擎。还深入讨论了各种技术实现,比如解释、即时编译及自适应优化。对Java线程和监视器的行为也有精彩讲解。
  本书还讨论了垃圾收集,包括引用对象.火车算法以及对象终结。最后,还讨论了错综复杂的Java安全模型,包括类型安全性。类装载器体系、类校验器、安全管理器。访问控制器和代码签名。
  通过本书,读者可以充分理解Java的连接模型和动态扩展机制,学习如何编写类装载器,了解编写平台独立的Java程序的7个步骤。
 Java世界和JVM体系结构的完整描述
 class文件,字节码及其在类装载期间的转换和验证
 算术、逻辑和数组操作以及流程控制
 方法调用及返回。异常。垃圾收集和线程
 JVM的即时编译器实现

图书特色

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技术的深入概览。
  Java编程语言似乎将要成为继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虚拟机规范的补充,书中对规范做出了解释。 
  

作者简介

(美)Bill Venners:暂无简介

译者简介

曹晓钢 蒋靖:暂无简介

译者序

计算机艺术的魅力在于其严谨性和复杂性。无论是股票交易还是人机国际象棋大战,所有的程序运行所需要的底层机器指令都只是有限的若干条。从大型的UNIX机器到桌面个人计算机,无不基于那些设计精良而优美的指令集。但是这些指令集之间互不兼容,这就使得程序的移植变得非常困难,所需时间甚至超过了重新编写一遍的时间。于是,虚拟机的概念出现了。Java虚拟机(JVM)在多个平台上实现统一语言;.NET的虚拟机(目前)在单一平台上实现多种语言。但无论如何,它们都是抽象的计算机。尽管它们都有自己的指令集,自己的内存体系。但它们却往往比实际的硬件机器简单明了。分析这样的一个虚拟机,对提高读者对底层硬件和虚拟机
平台的理解大有裨益。
  Java之所以得以大行其道,除了它是一门面向对象、构造精美的语言之外,更重要的原因在于:它摆脱了具体机器的束缚,使跨越不同平台编写程序成为可能。Java语言丰富的开放式类库大量使用设计模式,成功地改变了很多程序员的编程思想和习惯。但是,诸如class文件是如何被调入内存执行的、类的静态方法和静态变量的初始化是按照什么步骤进行的、对象的垃圾收集是如何以及在什么时候发生的,这些具体问题却不是每个人都清楚的。很多人对此只是有一个模糊的印象,稍微深入就难以回答。假若能够有一本书简明扼要地解释这些JVM运行的细节,而又不需要去钻研艰深的JVM规范,那该有多好!读者现在看到的这本书就可以满足这些要求。
  本书作者是一位JVM领域的顶尖高手,他写的这本书却一点儿都不难懂,任何人都可以从书中领会到Java的真正精髓——无需别人告诉你,从作者娓娓道来的分析中,就可以自己得出那些高手们才能理解的结论。
  本书在Java专业书籍中的地位是无可替代的,简单地说,读者不容易找到第二本像本书这样如此细致地讨论Java虚拟机的书。假如你真的想深入了解Java的精髓,理解在别的书中花费很长时间讲解的“道理”或者“难点”,那么读读这本书吧!你可能比那些所谓的高手理解得更加深刻。
  本书由曹晓钢和蒋靖翻译。其中蒋靖翻译了第6章、第10~19章以及附录,曹晓钢翻译了前言、第2~5章、第7~9章和第20章,第1章由两人合译。
  由于时间仓促,加上译者水平有限,书中难免有翻译不妥之处,希望广大读者和同行批评指正。
  译 者
  2003.5

图书目录

译者序
前言
第1章 Java体系结构介绍
 1.1 为什么使用Java
 1.2 网络带来的挑战和机遇
 1.3 体系结构
 1.3.1 Java虚拟机
 1.3.2 类装载器的体系结构
 1.3.3 Java class文件
 1.3.4 Java API
 1.3.5 Java程序设计语言
 1.4 Java体系结构的代价
 1.5 结论
 1.6 资源页
第2章 平台无关
 2.1 为什么要平台无关
 2.2 Java的体系结构对平台无关的支持
 2.2.1 Java平台
 2.2.2 Java语言
 2.3.3 Java class文件
 2.2.4 可伸缩性
 2.3 影响平台无关性的因素
 2.3.1 Java平台的部署
 2.3.2 Java平台的版本
 2.3.3 本地方法
 2.3.4 非标准运行时库
 2.3.5 对虚拟机的依赖
 2.3.6 对用户界面的依赖
 2.3.7 Java平台实现中的bug
 2.3.8 测试
 2.4 平台无关的七个步骤
 2.5 平台无关性的策略
 2.6 平台无关性和网络移动对象
 2.7 资源页
第3章 安全
 3.1 为什么需要安全性
 3.2 基本沙箱
 3.3 类装载器体系结构
 3.4 class文件检验器
  3.4.1 第一趟:class文件的结构检查
  3.4.2 第二趟:类型数据的语义检查
  3.4.3 第三趟:字节码验证
  3.4.4 第四趟:符号引用的验证
  3.4.5 二进制兼容
 3.5 Java虚拟机中内置的安全特性
 3.6 安全管理器和Java API
 3.7 代码签名和认证
 3.8 一个代码签名示例
 3.9 策略
 3.10 保护域
 3.11 访问控制器
  3.11.1 implies()方法
  3.11.2 栈检查示例
  3.11.3 一个回答“是”的栈检查
  3.11.4 一个回答“不”的栈检查
  3.11.5 doPrivileged()方法
  3.11.6 doPrivileged()的一个无效使用
 3.12 Java安全模型的不足和今后的发展
  方向
 3.13 和体系结构无关的安全性
 3.14 资源页
第4章 网络移动性
 4.1 为什么需要网络移动性
 4.2 一种新的软件模式
 4.3 Java体系结构对网络移动性的支持
 4.4 applet:网络移动性代码的示例
 4.5 Jini服务对象:网络移动对象的示例
  4.5.1 Jini是什么
  4.5.2 Jini如何工作
  4.5.3 服务对象的优点
 4.6 网络移动性:Java设计的中心
 4.7 资源页
第5章 Java虚拟机
 5.1 Java虚拟机是什么
 5.2 Java虚拟机的生命周期
 5.3 Java虚拟机的体系结构
  5.3.1 数据类型
  5.3.2 字长的考量
  5.3.3 类装载器子系统
  5.3.4 方法区
  5.3.5 堆
  5.3.6 程序计数器
  5.3.7 Java栈
  5.3.8 栈帧
  5.3.9 本地方法栈
  5.3.10 执行引擎
  5.3.11 本地方法接口
 5.4 真实机器
 5.5 一个模拟:“Eternal Math”
 5.6 随书光盘
 5.7 资源页
第6章 Java class文件
 6.1 Java class文件是什么
 6.2 class文件的内容
 6.3 特殊字符串
  6.3.1 全限定名
  6.3.2 简单名称
  6.3.3 描述符
 6.4 常量池
 6.4.1 CONSTANT_Utf8_info表
 6.4.2 CONSTANT_Integer_info表
 6.4.3 CONSTANT_Float_info表
 6.4.4 CONSTANT_Long_info表
 6.4.5 CONSTANT_Double_info表
 6.4.6 CONSTANT_Class_info表
 6.4.7 CONSTANT_String_info表
 6.4.8 CONSTANT_Fieldref_info表
 6.4.9 CONSTANT_Methodref_info表
 6.4.10 CONSTANT_InterfaceMethodref_
      info表
 6.4.11 CONSTANT_NameAndType_info
      表
 6.5 字段
 6.6 方法
 6.7 属性
  6.7.1 属性格式
  6.7.2 Code属性
  6.7.3 ConstantValue属性
  6.7.4 Deprecated属性
  6.7.5 Exceptions属性
  6.7.6 InnerClasses属性
  6.7.7 LineNumberTable属性
  6.7.8 LocalVariableTable属性
  6.7.9 SourceFile属性
  6.7.10 Synthetic属性
 6.8 一个模拟:“Getting Loaded”
 6.9 随书光盘
 6.10 资源页
第7章 类型的生命周期
 7.1 类型装载、连接与初始化
  7.1.1 装载
  7.1.2 验证
  7.1.3 准备
  7.1.4 解析
  7.1.5 初始化
 7.2 对象的生命周期
  7.2.1 类实例化
  7.2.2 垃圾收集和对象的终结
 7.3 卸载类型
 7.4 随书光盘
 7.5 资源页
第8章 连接模型
 8.1 动态连接和解析
  8.1.1 解析和动态扩展
  8.1.2 类装载器与双亲委派模型
  8.1.3 常量池解析
  8.1.4 解析CONSTANT_Class_info入口
  8.1.5 解析CONSTANT_Fieldref_info
       入口
  S.1.6 解析CONSTANT_Methodref_info
       入口
  8.1.7 解析CONSTANT_Interface-
  Methodref_info入口
  8.1.8 解析CONSTANT_String_info入口 
  8.1.9 解析其他类型的入口
  8.1.10 装载约束
  8.1.11 编译时常量解析
  8.1.12 直接引用
  8.1.13 _quick指令
  8.1.14 示例:Salutation程序的连接
  8.1.15 示例:Greet程序的动态扩展
  8.1.16 使用1.1版本的用户自定义类装
  载器
  8.1.17 使用1.2版本的用户自定义类装
  载器
  8.1.18 示例:使用forName()的动态扩展
  8.1.19 示例:卸载无法触及的greeter类
  8.1.20 示例:类型安全性与装载约束
 8.2 随书光盘
 8.3 资源页
第9章 垃圾收集
 9.1 为什么要使用垃圾收集
 9.2 垃圾收集算法
 9.3 引用计数收集器
 9.4 跟踪收集器
 9.5 压缩收集器
 9.6 拷贝收集器
 9.7 按代收集的收集器
 9.8 自适应收集器
 9.9 火车算法
 9.9.1 车厢、火车和火车站
 9.9.2 车厢收集
 9.9.3 记忆集合和流行对象
 9.10 终结
 9.11 对象可触及性的生命周期
 9.11.1 引用对象
 9.11.2 可触及性状态的变化
 9.11.3 缓存、规范映射和临终清理
 9.12 一个模拟:“Heap of Fish”
 9.12.1 分配鱼
 9.12.2 设置引用
 9.12.3 垃圾收集
 9.12.4 压缩堆
 9.13 随书光盘
 9.14 资源页
第10章 栈和局部变量操作
 10.1 常量入栈操作
 10.2 通用栈操作
 10.3 把局部变量压入栈
 10.4 弹出栈顶部元素,将其赋给局部变量
 10.5 wide指令
 10.6 一个模拟:“Fibonacci Forever”
 10.7 随书光盘
 10.8 资源页
第11章 类型转换
 11.1 转换操作码
 11.2 一个模拟:“Conversion Diversion”
 11.3 随书光盘
 11.4 资源页
第12章 整数运算
 12.1 二进制补码运算  
 12.2 Inner Int:揭示Java int类型内部性质
     的applet
 12.3 运算操作码
 12.4 一个模拟:“Prime Time”
 12.5 随书光盘
 12.6 资源页
第13章 逻辑运算
 13.1 逻辑操作码
 13.2 一个模拟:“Logical Results”
 13.3 随书光盘
 13.4 资源页
第14章 浮点运算
 14.1 浮点数
 14.2 Inner Float:揭示Java float类型内部
     性质的applet
 14.3 浮点模式
 14.3.1 浮点值集合
 14.3.2 浮点值集的转换
 14.3.3 相关规则的本质
 14.4 浮点操作码
 14.5 一个模拟:“Circle of Squares”
 14.6 随书光盘
 14.7 资源页
第15章 对象和数组
 15.1 关于对象和数组的回顾
 15.2 针对对象的操作码
 15.3 针对数组的操作码
 15.4 一个模拟:“Three—Dimensional
     Array”
 15.5 随书光盘
 15.6 资源页
第16章 控制流
 16.1 条件分支
 16.2 五条件分支
 16.3 使用表的条件分支
 16.4 一个模拟:“Saying Tomato”
 16.5 随书光盘
 16.6 资源页
第17章 异常
 17.1 异常的抛出与捕获
 17.2 异常表
 17.3 一个模拟:“Play Ball!”
 17.4 随书光盘
 17.5 资源页
第18章 finally子句
 18.1 微型子例程
 18.2 不对称的调用和返回
 18.3 一个模拟:“Hop Around”
 18.4 随书光盘
 18.5 资源页
第19章 方法的调用与返回
 19.1 方法调用
  19.1.1 Java方法的调用
  19.1.2 本地方法的调用 
 19.2 方法调用的其他形式
 19.3 指令invokespecial
  19.3.1 指令invokespecial和<init>()方法 
  19.3.2 指令invokespecial和私有方法
  19.3.3 指令invokespecial和super关键字
 19.4 指令invokeinterface
 19.5 指令的调用和速度
 19.6 方法调用的实例
 19.7 从方法中返回
 19.8 随书光盘
 19.9 资源页
第20章 线程同步
 20.1 监视器
20.2 对象锁
20.3 指令集中对同步的支持
 20.3.1 同步语句
 20.3.2 同步方法
20.4 Object类中的协调支持
20.5 随书光盘
20.6 资源页
附录A 按操作码助记符排列的指令集
附录B 按功能排列的操作码助记符
附录C 按操作码字节值排列的操作码助
    记符
附录D Java虚拟机的一个模拟:“Slices
    of Pi”

教学资源推荐
作者: 郑阿奇
作者: [美]埃里克 S. 罗伯茨(Eric S. Roberts) 著
作者: (美)Martin Kalin
参考读物推荐
作者: 邵丁丁 著
作者: (美)Steven Holzner 著
作者: (美)Holden Karau 著
作者: [英]邓肯·麦格雷戈(Duncan McGregor),[英]纳特·普莱斯(Nat Pryce) 著