logo资料库

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

第1页 / 共79页
第2页 / 共79页
第3页 / 共79页
第4页 / 共79页
第5页 / 共79页
第6页 / 共79页
第7页 / 共79页
第8页 / 共79页
资料共79页,剩余部分请下载后查看
深入理解 Java 虚拟机(JVM 高级特性与最佳实践) 内容简介 作为一位 Java 程序员,你是否也曾经想深入理解 Java 虚拟机,但是却被它的复杂和深奥拒之 门外?没关系,本书极尽化繁为简之妙,能带领你在轻松中领略 Java 虚拟机的奥秘。本书是近年来 国内出版的唯一一本与 Java 虚拟机相关的专著,也是唯一一本同时从核心理论和实际运用这两个角 度去探讨 Java 虚拟机的著作,不仅理论分析得透彻,而且书中包含的典型案例和最佳实践也极具现 实指导意义。 全书共分为五大部分。第一部分从宏观的角度介绍了整个 Java 技术体系的过去、现在和未来, 以及如何独立地编译一个 OpenJDK7,这对理解后面的内容很有帮助。第二部分讲解了 JVM 的自动 内存管理,包括虚拟机内存区域的划分原理以及各种内存溢出异常产生的原因;常见的垃圾收集算法 以及垃圾收集器的特点和工作原理;常见的虚拟机的监控与调试工具的原理和使用方法。第三部分分 析了虚拟机的执行子系统,包括 Class 的文件结构以及如何存储和访问 Class 中的数据;虚拟机的类 创建机制以及类加载器的工作原理和它对虚拟机的意义;虚拟机字节码的执行引擎以及它在实行代码 时涉及的内存结构。第四部分讲解了程序的编译与代码的优化,阐述了泛型、自动装箱拆箱、条件编 译等语法糖的原理;讲解了虚拟机的热点探测方法、HotSpot 的即时编译器、编译触发条件,以及如 何从虚拟机外部观察和分析 JIT 编译的数据和结果。第五部分探讨了 Java 实现高效并发的原理,包 括 JVM 内存模型的结构和操作;原子性、可见性和有序性在 Java 内存模型中的体现;先行发生原则 的规则和使用;线程在 Java 语言中的实现原理;虚拟机实现高效并发所做的一系列锁优化措施。 本书适合所有 Java 程序员、系统调优师和系统架构师阅读。 作者简介 周志明,资深 Java 技术专家,对 JavaEE 企业级应用开发、OSGi、Java 虚拟机和工作流等都 有深入的研究,并在大量的实践中积累了丰富的经验。尤其精通 Java 虚拟机,撰写了大量与 JVM 相 关的经典文章,被各大技术社区争相转载,是 ITeye 等技术社区公认的 Java 虚拟机方面的领袖人物 之一。现任远光软件股份有限公司平台开发部经理兼平台架构师,先后参加与过国家电网、南方电网 等多个国家级大型 ERP 项目的平台架构工作,对软件系统架构也有深刻的认识和体会。 专家推荐
Java 程序是如何运行的?Java 虚拟机在其中扮演了怎样的角色?如何让 Java 程序具有更高的 并发性?许多 Java 程序员都会诸如此类的疑问。无奈,国内在很长一段时间里都没有一本从实际应 用的角度讲解 Java 虚拟机的著作,本书的出版可谓填补了这个空白。它从 Java 程序员的角度出发, 系统地将 Java 程序运行过程中涉及的各种知识整合到了一起,并配以日常工作中可能会碰到的疑难 案例,引领读者轻松踏上探索 Java 虚拟机的旅途,是广大对 Java 虚拟机感兴趣的读者的福音!—— 莫枢(RednaxelaFX) 虚拟机和编程语言爱好者 在武侠的世界里,无论是至刚至强的《易筋经》,还是阴柔无比的《葵花宝典》,都离不开内功 修炼。没有了内功心法,这些武术只是花拳绣腿的拙劣表演而已。软件业是武林江湖的一个翻版,也 有着大量的模式、套路、规范等外功,但“外功修行,内功修神”,要想成为“扫地僧”一样的绝世高人, 此书是必备的。——秦小波 资深 Java 技术专家/著有畅销书《设计模式之禅》 对 Java 程序员来说,Java 虚拟机可以说是既熟悉又神秘,很少 Java 程序员能够抑制自己探究 它的冲动。可惜,分析 JVM 实现原理的书籍(特别是国内作者出版的)是少之又少。本书的出版可 谓 Java 程序员的福音,作者将自己多年来在 Java 虚拟机领域的实践经验和研究心得呈现在了这本 书中,不仅系统地讲解了 Java 虚拟机工作机制和底层原理,而且更难能可贵的是与实践很好地结合 了起来,具有非常强的实践指导意义,强烈推荐!——计文柯 资深 Java 技术专家/著有畅销书《Spring 技术内幕:深入解析 Spring 架构设计与实现原理》 前言 Java 是目前用户最多、使用范围最广的软件开发技术,Java 的技术体系主要由支撑 Java 程序 运行的虚拟机、为各开发领域提供接口支持的 Java API、Java 编程语言及许许多多的第三方 Java 框架(如 Spring 和 Struts 等)构成。在国内,有关 Java API、Java 语言及第三方框架的技术资料和 书籍非常丰富,相比之下,有关 Java 虚拟机的资料却显得异常贫乏。 这种状况很大程度上是由 Java 开发技术本身的一个重要优点导致的:在虚拟机层面隐藏了底层 技术的复杂性以及机器与操作系统的差异性。运行程序的物理机器情况千差万别,而 Java 虚拟机则 在千差万别的物理机上面建立了统一的运行平台,实现了在任意一台虚拟机上编译的程序都能在任何 一台虚拟机上正常运行。这一极大的优势使得 Java 应用的开发比传统 C/C++应用的开发更高效和快 捷,程序员可以把主要精力集中在具体业务逻辑上,而不是物理硬件的兼容性上。一般情况下,一个 程序员只要了解了必要的 Java API、Java 语法并学习适当的第三方开发框架,就已经基本能满足日 常开发的需要了,虚拟机会在用户不知不觉中完成对硬件平台的兼容以及对内存等资源的管理工作。 因此,了解虚拟机的运作并不是一般开发人员必须掌握的知识。
然而,凡事都具备两面性。随着 Java 技术的不断发展,它被应用于越来越多的领域之中。其中 一些领域,如电力、金融、通信等,对程序的性能、稳定性和可扩展性方面都有极高的要求。一个程 序很可能在 10 个人同时使用时完全正常,但是在 10000 个人同时使用时就会变慢、死锁甚至崩溃。 毫无疑问,要满足 10000 个人同时使用需要更高性能的物理硬件,但是在绝大多数情况下,提升硬 件效能无法等比例地提升程序的性能和并发能力,有时甚至可能对程序的性能没有任何改善作用。这 里面有 Java 虚拟机的原因:为了达到为所有硬件提供一致的虚拟平台的目的,牺牲了一些硬件相关 的性能特性。更重要的是人为原因:开发人员如果不了解虚拟机的一些技术特性的运行原理,就无法 写出最适合虚拟机运行和可自优化的代码。 其实,目前商用的高性能 Java 虚拟机都提供了相当多的优化特性和调节手段,用于满足应用程 序在实际生产环境中对性能和稳定性的要求。如果只是为了入门学习,让程序在自己的机器上正常运 行,那么这些特性可以说是可有可无的;如果用于生产环境,尤其是企业级应用开发中,就迫切需要 开发人员中至少有一部分人对虚拟机的特性及调节方法具有很清晰的认识,所以在 Java 开发体系中, 对架构师、系统调优师、高级程序员等角色的需求一直都非常大。学习虚拟机中各种自动运作的特性 的原理也成为了 Java 程序员成长道路上必然会接触到的一课。通过本书,读者可以以一种相对轻松 的方式学习虚拟机的运作原理,对 Java 程序员的成长也有较大的帮助。 本书读者对象 (1) 使用 Java 技术体系的中、高级开发人员 Java 虚拟机作为中、高级开发人员必须修炼的知识,有着较高的学习门槛,本书可作为学习虚拟 机的优秀教材。 (2) 系统调优师 系统调优师是近几年才兴起的职业,本书中的大量案例、代码和调优实战将会对系统调优师的日 常工作有直接的帮助。 (3) 系统架构师 保障系统高效、稳定和可伸缩是系统架构师的主要职责之一,而这与虚拟机的运作密不可分,本 书可以作为他们设计应用系统底层框架的参考资料。 如何阅读本书 本书一共分为五个部分:走近 Java、自动内存管理机制、虚拟机执行子系统、程序编译与代码 优化、高效并发。各个部分基本上是相互独立的,没有必然的前后依赖关系,读者可以从任何一个感 兴趣的专题开始阅读,但是每个部分中的各个章节间有先后顺序。 本书并不假设读者在 Java 领域具备很专业的技术水平,因此在保证逻辑准确的前提下,尽量用 通俗的语言和案例讲述虚拟机中与开发关系最为密切的内容。当然学习虚拟机技术本身就需要读者有 一定的技术基础,且本书的读者定位是中、高级程序员,因此本书假设读者自己了解一些常用的开发
框架、Java API 和 Java 语法等基础知识。 语言约定 本书在语言和技术上有如下的约定: 本书中提到 HotSpot 虚拟机、JRockit 虚拟机、WebLogic 服务器等产品的所有者时,仍然使用 Sun 和 BEA 公司的名称。实际上 BEA 和 Sun 分别于 2008 年和 2010 年被 Oracle 公司收购,现在已 经不存在这两个商标了,但是毫无疑问它们都是对 Java 领域做出过卓越贡献的、值得程序员纪念的 公司。 JDK 从 1.5 版本开始,在官方的正式文档与宣传资料中已经不再使用类似“JDK 1.5”的名称,只 有在程序员内部使用的开发版本号 (Developer Version,例如 java -version 的输出)中才继续沿用 1.5、1.6 和 1.7 的版本号,而公开版本号(Product Version)则改为 JDK 5、JDK 6 和 JDK 7 的命名 方式。为了行文一致,本书所有场合统一采用开发版本号的命名方式。 由于版面关系,本书中的许多示例代码都没有遵循最优的代码编写风格,如使用的流没有关闭流 等,请读者在阅读时注意这一点。 如果没有特殊说明,本书中所有的讨论都是以 Sun JDK 1.6 为技术平台的。不过如果有某个特 性在各个版本间的变化较大,一般都会说明它在各个版本间的差异。 内容特色 第一部分 走近 Java 本书的第一部分为后文的讲解建立了良好的基础。尽管了解 Java 技术的来龙去脉,以及编译自 己的 OpenJDK 对于读者理解 Java 虚拟机并不是必需的,但是这些准备过程可以为走近 Java 技术和 Java 虚拟机提供很好的引导。第一部分只有第 1 章: 第 1 章 介绍了 Java 技术体系的过去、现在和未来的发展趋势,并介绍了如何独立编译一个 OpenJDK 7。 第二部分 自动内存管理机制 因为程序员把内存控制的权力交给了 Java 虚拟机,所以可以在编码的时候享受自动内存管理的 诸多优势,不过也正因为这个原因,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样 使用内存的,那么排查错误将会成为一项异常艰难的工作。第二部分包括第 2~5 章: 第 2 章 讲解了虚拟机中的内存是如何划分的,哪部分区域、什么样的代码和操作可能导致内存 溢出异常,并讲解了各个区域出现内存溢出异常的常见原因。 第 3 章 分析了垃圾收集的算法和 JDK 1.6 中提供的几款垃圾收集器的特点及运作原理,通过代 码实例验证了 Java 虚拟机中的自动内存分配及回收的主要规则。 第 4 章 介绍了随 JDK 发布的 6 个命令行工具与 2 个可视化的故障处理工具的使用方法。
第 5 章 与读者分享了几个比较有代表性的实际案例,还准备了一个所有开发人员都能“亲身实 战”的练习,读者可通过实践来获得故障处理和调优的经验。 第三部分 虚拟机执行子系统 执行子系统是虚拟机中必不可少的组成部分,了解了虚拟机如何执行程序,才能写出更优秀的代 码。第三部分包括第 6~9 章: 第 6 章 讲解了 Class 文件结构中的各个组成部分,以及每个部分的定义、数据结构和使用方法, 以实战的方式演示了 Class 的数据是如何存储和访问的。 第 7 章 介绍了在类加载过程的“加载”、“验证”、“准备”、“解析”和“初始化”这五个阶段中虚拟机 分别执行了哪些动作,还介绍了类加载器的工作原理及其对虚拟机的意义。 第 8 章 分析了虚拟机在执行代码时如何找到正确的方法,如何执行方法内的字节码,以及执行 代码时涉及的内存结构。 第 9 章 通过四个类加载及执行子系统的案例,分享了使用类加载器和处理字节码的一些值得欣 赏和借鉴的思路,并通过一个实战练习来加深对前面理论知识的理解。 第四部分 程序编译与代码优化 Java 程序从源码编译成字节码和从字节码编译成本地机器码的这两个过程,合并起来其实就等 同于一个传统编译器所执行的编译过程。第四部分包括第 10 和 11 章: 第 10 章 分析了 Java 语言中的泛型、自动装箱拆箱、条件编译等多种语法糖的前因后果,并通 过实战案例演示了如何使用插入式注解处理器来实现一个检查程序命名规范的编译器插件。 第 11 章 讲解了虚拟机的热点探测方法、HotSpot 的即时编译器、编译触发条件,以及如何从 虚拟机外部观察和分析 JIT 编译的数据和结果。此外,还讲解了几种常见的编译期优化技术。 第五部分 高效并发 Java 语言和虚拟机提供了原生的、完善的多线程支持,使得它天生就适合开发多线程并发的应 用程序。不过我们不能期望系统来完成所有与并发相关的处理,了解并发的内幕也是一个高级程序员 不可缺少的课程。第五部分包括第 12 和 13 章: 第 12 章 讲解了虚拟机的 Java 内存模型的结构和操作,以及原子性、可见性和有序性在 Java 内存模型中的体现,介绍了先行发生原则及使用,还讲解了线程在 Java 语言中是如何实现的。 第 13 章 介绍了线程安全所涉及的概念和分类、同步实现的方式以及虚拟机的底层运作原理, 并且还介绍了虚拟机实现高效并发所采取的一系列锁优化措施。 参考资料 本书名为“深入理解 Java 虚拟机”,但要想真的深入理解虚拟机,仅凭一本书肯定是远远不够的, 读者可以通过下面的信息找到更多关于 Java 虚拟机方面的资料。我在写作此书的时候,也从下面这 些参考资料中获得了很大的帮助。
(1)书籍 《The Java Virtual Machine Specification, Second Edition》① 《Java 虚拟机规范(第 2 版)》,1999 年 4 月出版。国内并没有引进这本书,自然也就没有中 文译本,但全书的电子版是免费发布的,在 IT 书籍中它已经非常“高寿”了①(这本书的第 3 版已处于 基本完成的草稿状态,在 JDK 1.7 正式版发布后这本书应该就会推出第 3 版)。要学习虚拟机,虚拟 机规范无论如何都是必须读的。这本书的概念和细节描述与 Sun 的早期虚拟机(Sun Classic VM) 高度吻合,不过,随着技术的发展,高性能虚拟机真正的细节实现方式与虚拟机规范所描述的差距已 经越来越大。但是,如果只能选择一本参考书来了解虚拟机的话,那仍然是这本书。 《The Java Language Specification, Third Edition》② 《Java 语言规范(第 3 版)》,2005 年 7 月由机械工业出版社出版,不过出版的是影印版,没 有中文译本。虽然 Java 虚拟机并不是 Java 语言专有的,但是了解 Java 语言的各种细节规定对虚拟 机的行为也是很有帮助的,它与《Java 虚拟机规范(第 2 版)》都是 Sun 官方出品的书籍,而且这 本书还是由 Java 之父 James Gosling 亲自撰写的。 《Oracle JRockit The Definitive Guide》 《Oracle JRockit 权威指南》,2010 年 7 月出版,国内也没有(可能是尚未)引进这本书,它 是由 JRockit 的两位资深开发人员(其中一位是 JRockit Mission Control 团队的 TeamLeader)撰写 的高级 JRockit 虚拟机使用指南。虽然 JRockit 的用户量可能不如 HotSpot 多,但也是最流行的三大 商业虚拟机之一,并且不同虚拟机中的很多实现思路都是可以对比参照的。这本书是了解现代高性能 虚拟机的很好的途径。 《Inside the Java 2 Virtual Machine, Second Edition》 《深入 Java 虚拟机(第 2 版)》,2000 年 1 月出版,2003 年机械工业出版社出版了中文译本。 在相当长的时间里,这本书是唯一一本关于 Java 虚拟机的中文图书。 (2)网站资源 高级语言虚拟机圈子:http://hllvm.group.iteye.com/ 里面有一些国内关于虚拟机的讨论,并不只限于 JVM,而是涉及对所有的高级语言虚拟机 (High-Level Language Virtual Machine)的讨论,但该网站建立在 ITEye①上,自然还是以讨论 Java 虚拟机为主。圈主撒迦(莫枢)的博客(http://rednaxelafx.iteye.com/)是另外一个非常有价值的虚 拟机及编译原理等资料的分享园地。 HotSpot Internals:http://wikis.sun.com/display/HotSpotInternals/Home 一个关于 OpenJDK 的 Wiki 网站,许多文章都由 JDK 的开发团队编写,更新很慢,但是仍然有 很大的参考价值。 The HotSpot Group:http://openjdk.java.net/groups/hotspot/
HotSpot 组群,包含虚拟机开发、编译器、垃圾收集和运行时四个邮件组,其中有关于 HotSpot 虚拟机的最新讨论。 联系作者 在本书完稿时,我并没有像想象中那样兴奋或放松,写作时的那种“战战兢兢、如履薄冰”的感觉 依然萦绕在心头。在每一章、每一节落笔之时,我都在考虑如何才能把各个知识点更有条理地讲述出 来,都在担心会不会由于自己理解有偏差而误导了大家。囿于我的写作水平和写作时间,书中难免存 在不妥之处,所以特地开通了一个读者邮箱(understandingjvm@gmail.com)与大家交流,大家如 有任何意见或建议都欢迎与我联系。 此外,大家也可以通过我的微博(http://t.sina.com.cn//icyfenix)与我取得联系。 勘误 写书和写代码一样,刚开始都是不完美的,需要不断地修正和重构,本书也不例外。如果大家在 阅读本书的过程中发现了本书中存在的任何问题,都欢迎反馈给我们。我们会把本书的勘误集中公布 在 www.yangfuchuan.com。 目录 目 录 前 言 致 谢 第一部分 走近 Java 第 1 章 走近 Java / 2 1.1 概述 / 2 1.2 Java 技术体系 / 3 1.3 Java 发展史 / 5 1.4 展望 Java 技术的未来 / 9 1.4.1 模块化 / 9 1.4.2 混合语言 / 9 1.4.3 多核并行 / 11 1.4.4 进一步丰富语法 / 12 1.4.5 64 位虚拟机 / 13 1.5 实战:自己编译 JDK / 13 1.5.1 获取 JDK 源码 / 13 1.5.2 系统需求 / 14
1.5.3 构建编译环境 / 15 1.5.4 准备依赖项 / 17 1.5.5 进行编译 / 18 1.6 本章小结 / 21 第二部分 自动内存管理机制 第 2 章 Java 内存区域与内存溢出异常 / 24 2.1 概述 / 24 2.2 运行时数据区域 / 25 2.2.1 程序计数器 / 25 2.2.2 Java 虚拟机栈 / 26 2.2.3 本地方法栈 / 27 2.2.4 Java 堆 / 27 2.2.5 方法区 / 28 2.2.6 运行时常量池 / 29 2.2.7 直接内存 / 29 2.3 对象访问 / 30 2.4 实战:OutOfMemoryError 异常 / 32 2.4.1 Java 堆溢出 / 32 2.4.2 虚拟机栈和本地方法栈溢出 / 35 2.4.3 运行时常量池溢出 / 38 2.4.4 方法区溢出 / 39 2.4.5 本机直接内存溢出 / 41 2.5 本章小结 / 42 第 3 章 垃圾收集器与内存分配策略 / 43 3.1 概述 / 43 3.2 对象已死? / 44 3.2.1 引用计数算法 / 44 3.2.2 根搜索算法 / 46 3.2.3 再谈引用 / 47 3.2.4 生存还是死亡? / 48 3.2.5 回收方法区 / 50 3.3 垃圾收集算法 / 51
分享到:
收藏