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

深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)
作者 : 周志明 著
丛书名 : 原创精品系列
出版日期 : 2013-05-30
ISBN : 978-7-111-42190-0
定价 : 79.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 451
开本 : 16
原书名 :
原出版社:
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书第1版两年内印刷近10次,4家网上书店的评论近4000条,98%以上的评论全部为5星级的好评,是整个Java图书领域公认的经典著作和超级畅销书,繁体版在台湾也十分受欢迎。第2版在第1版的基础上做了很大的改进:根据最新的JDK1.7对全书内容进行了全面的升级和补充;增加了大量处理各种常见JVM问题的技巧和最佳实践;增加了若干与生产环境相结合的实战案例;对1版中的错误和不足之处的修正;等等。第2版不仅技术更新、内容更丰富,而且实战性更强。
全书共分为五大部分,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行了全面而深入的分析,深刻揭示了JVM的工作原理。第一部分从宏观的角度介绍了整个Java技术体系、Java和JVM的发展历程、模块化,以及JDK的编译,这对理解本书后面内容有重要帮助。第二部分讲解了JVM的自动内存管理,包括虚拟机内存区域的划分原理以及各种内存溢出异常产生的原因;常见的垃圾收集算法以及垃圾收集器的特点和工作原理;常见虚拟机监控与故障处理工具的原理和使用方法。第三部分分析了虚拟机的执行子系统,包括类文件结构、虚拟机类加载机制、虚拟机字节码执行引擎。第四部分讲解了程序的编译与代码的优化,阐述了泛型、自动装箱拆箱、条件编译等语法糖的原理;讲解了虚拟机的热点探测方法、HotSpot的即时编译器、编译触发条件,以及如何从虚拟机外部观察和分析JIT编译的数据和结果;第五部分探讨了Java实现高效并发的原理,包括JVM内存模型的结构和操作;原子性、可见性和有序性在Java内存模型中的体现;先行发生原则的规则和使用;线程在Java语言中的实现原理;虚拟机实现高效并发所做的一系列锁优化措施。

图书特色

超级畅销书全新升级,第1版两年内重印近10次,Java图书领域公认的经典著作,繁体版台湾发行
基于最新JDK 1.7,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行全面而深入的分析,深刻揭示JVM的工作原理
以实践为导向,通过大量与实际生产环境相结合的案例展示了解决各种常见JVM问题的技巧和最佳实践

深入理解Java虚拟机
JVM高级特性与最佳实践
第2版
Understanding the JVM
Advanced Features and Best Practices,
Second Edition
周志明 著
Java程序是如何运行的?Java虚拟机在其中扮演了怎样的角色?如何让Java程序具有更高的并发性?许多Java程序员都会有诸如此类的疑问。无奈,国内在很长一段时间里都没有一本从实际应用的角度讲解Java虚拟机的著作,本书的出版可谓填补了这个空白。它从Java程序员的角度出发,系统地将Java程序运行过程中涉及的各种知识整合到一起,并配以日常工作中可能会碰到的疑难案例,引领读者轻松踏上探索Java虚拟机的旅途,是对Java虚拟机感兴趣的广大读者的福音!
—— 莫枢(RednaxelaFX)Oracle HotSpot VM编译器团队工程师
Java技术的通用性、高效性、平台移植性和安全性使之成为网络计算的理想技术,从普通的PC到数据中心、从游戏控制台到科学超级计算机、从手机到互联网,Java技术无处不在。Java虚拟机正是支撑和实现这一切的秘密武器,它使得Java成为一个强大的、一致的、稳定的、广阔的运行平台。
“技术原理”和“实战运用”两条主线贯穿全书,在讲解Java虚拟机的工作原理和核心知识的同时,还用通俗的语言和具有代表性的案例讲述了Java虚拟机中与应用程序开发关系最为密切的内容。通过阅读本书,大家可以用一种相对较轻松的方式来学习和探索Java虚拟机运作的秘密。
第2版与第1版的区别:
根据最新的JDK 1.7对第1版内容进行了全面修订和补充,增加了很多新的内容,如JDK 1.7中新加入的G1收集器、JSR-292 InvokeDynamic(对非Java语言的调用支持)等内容;
应部分读者的要求,介绍了OpenJDK的阅读、编译与调试方法,对OpenJDK的源代码进行了更多、更深入的分析;
实践性进一步增强,增加了许多处理各种常见JVM问题的技巧和最佳实践,如GC日志的分析,以及JIT编译器代码优化过程和生成代码的分析等;
增加了若干处理JVM问题的实践案例;
修正了第1版中的50余处错误的、有歧义的和不完整的描述。


在武侠的世界里,无论是至刚至强的《易筋经》,还是阴柔无比的《葵花宝典》,都离不开内功修炼。没有了内功心法,这些武术只是花拳绣腿的拙劣表演而已。软件业是武林江湖的一个翻版,也有着大量的模式、套路、 规范等外功,但“外功修行,内功修神”,要想成为“扫地僧”一样的绝世高人,此书是必备的。
—— 秦小波
资深Java技术专家
/著有畅销书《设计模式之禅》
对Java程序员来说,Java虚拟机可以说是既熟悉又神秘,很少有Java程序员能够抑制自己探究它的冲动。可惜,分析JVM实现原理的书籍(特别是国内作者出版的)少之又少。本书的出版可谓Java程序员的福音,作者将自己多年来在Java虚拟机领域的实践经验和研究心得呈现在这本书中,不仅系统地讲解了Java虚拟机工作机制和底层原理,而且难能可贵的是与实践很好地结合了起来,具有非常强的实践指导意义,强烈推荐!
—— 计文柯
资深Java技术专家
/著有畅销书《Spring技术内幕:
深入解析Spring架构与设计原理》

周志明 资深Java技术专家,对JavaEE企业级应用开发、OSGi、Java虚拟机和工作流等都有深入的研究,并在大量的实践中积累了丰富的经验。尤其精通Java虚拟机,撰写了大量与JVM相关的经典文章,被各大技术社区争相转载,是ITeye等技术社区公认的Java虚拟机方面的领袖人物之一。除本书外,还著有经典著作《深入理解OSGi:Equinox原理、应用与最佳实践》,广获读者好评。现任远光软件股份有限公司开发部总经理兼架构师,先后参与过国家电网、南方电网等多个国家级大型ERP项目的平台架构工作,对软件系统架构也有深刻的认识和体会。

图书前言

Java是目前用户最多、使用范围最广的软件开发技术之一。Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java API、Java编程语言及许多第三方Java框架(如Spring、Struts等)构成。在国内,有关Java API、Java语言语法及第三方框架的技术资料和书籍非常丰富,相比之下,有关Java虚拟机的资料却显得异常贫乏。
  这种状况在很大程度上是由Java开发技术本身的一个重要优点导致的:在虚拟机层面隐藏了底层技术的复杂性以及机器与操作系统的差异性。运行程序的物理机器的情况千差万别,而Java虚拟机则在千差万别的物理机上建立了统一的运行平台,实现了在任意一台虚拟机上编译的程序都能在任何一台虚拟机上正常运行。这一极大优势使得Java应用的开发比传统C/C++应用的开发更高效和快捷,程序员可以把主要精力集中在具体业务逻辑上,而不是物理硬件的兼容性上。在一般情况下,一个程序员只要了解了必要的Java API、Java语法,以及学习适当的第三方开发框架,就已经基本能满足日常开发的需要了,虚拟机会在用户不知不觉中完成对硬件平台的兼容及对内存等资源的管理工作。因此,了解虚拟机的运作并不是一般开发人员必须掌握的知识。
  然而,凡事都具备两面性。随着Java技术的不断发展,它被应用于越来越多的领域之中。其中一些领域,如电力、金融、通信等,对程序的性能、稳定性和可扩展性方面都有极高的要求。程序很可能在10个人同时使用时完全正常,但是在10 000个人同时使用时就会缓慢、死锁,甚至崩溃。毫无疑问,要满足10 000个人同时使用需要更高性能的物理硬件,但是在绝大多数情况下,提升硬件效能无法等比例地提升程序的运作性能和并发能力,甚至可能对程序运作状况完全没有任何改善。这里面有Java虚拟机的原因:为了达到给所有硬件提供一致的虚拟平台的目的,牺牲了一些与硬件相关的性能特性。更重要的是人为原因:如果开发人员不了解虚拟机一些技术特性的运行原理,就无法写出最适合虚拟机运行和自优化的代码。
  其实,目前商用的高性能Java虚拟机都提供了相当多的优化特性和调节手段,用于满足应用程序在实际生产环境中对性能和稳定性的要求。如果只是为了入门学习,让程序在自己的机器上正常运行,那么这些特性可以说是可有可无的;如果用于生产开发,尤其是企业级生产开发,就迫切需要开发人员中至少有一部分人对虚拟机的特性及调节方法具有很清晰的认识,所以在Java开发体系中,对架构师、系统调优师、高级程序员等角色的需求一直都非常大。学习虚拟机中各种自动运作特性的原理也成为了Java程序员成长道路上必然会接触到的一课。本书可以使读者以一种相对轻松的方式学习虚拟机的运作原理,对Java程序员的成长也有较大的帮助。
第2版与第1版的区别
  JDK 1.7在2011年7月28日正式发布,相对于2006年发布的JDK 1.6,新版的JDK有了许多新的特性和改进。本书的第2版也相应地进行了修改和升级,把讲解的技术平台从JDK 1.6提升至JDK 1.7。例如,增加了对JDK 1.7中最新的G1收集器,以及JDK 1.7中JSR-292 InvokeDynamic(对非Java语言的调用支持)的分析讲解等内容。
  在第1版出版后,笔者收到了许多热心读者的反馈意见,部分读者提出OpenJDK开源已久,第1版却很少有直接分析OpenJDK源码的内容,有点“视宝山而不见”的感觉。因此,在本书第2版中,笔者特别加强了对这部分内容的讲解,其中在第1章中就介绍了如何分析、调试OpenJDK源码等。在本书后续章节中,不少关于功能点的讲解都直接使用OpenJDK中的HotSpot源码或者JIT编译器生成的本地代码作为论据。
  如何把Java虚拟机原理中许多理论性很强的知识、特性应用于实践开发,是本书贯穿始终的主旨。由于笔者希望在本书第2版中进一步加强知识的实践性,因此增加了许多对处理JVM常见问题技能的讲解,包括如何分析GC日志、如何分析JIT编译器代码优化过程和生成代码等。并且,在第1版的基础上,第2版中进一步增加了若干处理JVM问题的实践案例供读者参考。
  另外,本书第2版还修正了第1版中多处错误的、有歧义的和不完整的描述。有关勘误信息,可以参考第1版的勘误页面(http://icyfenix.iteye.com/blog/1119214)。
本书面向的读者
  (1)使用Java技术体系的中、高级开发人员
  Java虚拟机作为中、高级开发人员必须修炼的知识,有着较高的学习门槛,本书可作为学习虚拟机的优秀教材。
  (2)系统调优师
  系统调优师是近几年才兴起的职业,本书中的大量案例、代码和调优实战将会对系统调优师的日常工作有直接的帮助。
  (3)系统架构师
  保障系统的性能、并发和伸缩等能力是系统架构师的主要职责之一,而这部分与虚拟机的运作密不可分,本书可以作为他们制定应用系统底层框架的参考资料。
如何阅读本书
  本书一共分为五个部分:走近Java、自动内存管理机制、虚拟机执行子系统、程序编译与代码优化、高效并发。各部分基本上是互相独立的,没有必然的前后依赖关系,读者可以从任何一个感兴趣的专题开始阅读,但是每个部分中的各个章节间有先后顺序。
  本书并没有假设读者在Java领域具备很专业的技术水平,因此在保证逻辑准确的前提下,尽量用通俗的语言和案例讲述虚拟机中与开发的关系最为密切的内容。当然,学习虚拟机技术本身就需要读者有一定的基础,且本书的读者定位是中、高级程序员,因此本书假设读者自己了解一些常用的开发框架、Java API和Java语法等基础知识。
  笔者希望读者在阅读本书的同时,把本书中的实践内容亲自验证一遍,其中用到的代码清单可以从华章网站(http://www.hzbook.com)下载。
语言约定
  本书在语言和技术上有如下约定:
   本书中提到HotSpot、JRockit虚拟机、WebLogic服务器等产品的所有者时,仍然使用Sun和BEA公司的名称,实际上,BEA和Sun分别于2008年和2009年被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.7为技术平台的。不过如果有某个特性在各个版本间的变化较大,一般都会说明它在各个版本间的差异。
内容特色
  第一部分 走近Java
  本书的第一部分为后文的讲解建立了良好的基础。尽管了解Java技术的来龙去脉,以及编译自己的OpenJDK对于读者理解Java虚拟机并不是必需的,但是这些准备过程可以为走近Java技术和Java虚拟机提供很好的引导。第一部分只有第1章:
  第1章 介绍了Java技术体系的过去、现在和未来的一些发展趋势,并介绍了如何独立地编译一个OpenJDK 7。
  第二部分 自动内存管理机制
  因为程序员把内存控制的权力交给了Java虚拟机,所以可以在编码的时候享受自动内存管理的诸多优势,不过也正是这个原因,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会成为一项异常艰难的工作。第二部分包括第2~5章:
  第2章 讲解了虚拟机中内存是如何划分的,以及哪部分区域、什么样的代码和操作可能导致内存溢出异常,并讲解了各个区域出现内存溢出异常的常见原因。
  第3章 分析了垃圾收集的算法和JDK 1.7中提供的几款垃圾收集器的特点及运作原理。通过代码实例验证了Java虚拟机中自动内存分配及回收的主要规则。
  第4章 介绍了随JDK发布的6个命令行工具与两个可视化的故障处理工具的使用方法。
  第5章 与读者分享了几个比较有代表性的实际案例,还准备了一个所有开发人员都能“亲身实战”的练习,读者可通过实践来获得故障处理和调优的经验。
  第三部分 虚拟机执行子系统
  执行子系统是虚拟机中必不可少的组成部分,了解了虚拟机如何执行程序,才能写出更优秀的代码。第三部分包括第6~9章:
  第6章 讲解了Class文件结构中的各个组成部分,以及每个部分的定义、数据结构和使用方法,以实战的方式演示了Class文件的数据是如何存储和访问的。
  第7章 介绍了类加载过程的“加载”、“验证”、“准备”、“解析”和“初始化”5个阶段中虚拟机分别执行了哪些动作,还介绍了类加载器的工作原理及其对虚拟机的意义。
  第8章 分析了虚拟机在执行代码时如何找到正确的方法,如何执行方法内的字节码,以及执行代码时涉及的内存结构。
  第9章 通过4个类加载及执行子系统的案例,分享了使用类加载器和处理字节码的一些值得欣赏和借鉴的思路,并通过一个实战练习来加深对前面理论知识的理解。
  第四部分 程序编译与代码优化
  Java程序从源码编译成字节码和从字节码编译成本地机器码的这两个过程,合并起来其实就等同于一个传统编译器所执行的编译过程。第四部分包括第10~11章:
  第10章 分析了Java语言中泛型、主动装箱和拆箱、条件编译等多种语法糖的前因后果,并通过实战演示了如何使用插入式注解处理器来实现一个检查程序命名规范的编译器插件。
  第11章 讲解了虚拟机的热点探测方法、HotSpot的即时编译器、编译触发条件,以及如何从虚拟机外部观察和分析JIT编译的数据和结果,此外,还讲解了几种常见的编译优化技术。
  第五部分 高效并发
  Java语言和虚拟机提供了原生的、完善的多线程支持,这使得它天生就适合开发多线程并发的应用程序。不过我们不能期望系统来完成所有并发相关的处理,了解并发的内幕也是成为一个高级程序员不可缺少的课程。第五部分包括第12~13章:
  第12章 讲解了虚拟机Java内存模型的结构及操作,以及原子性、可见性和有序性在Java内存模型中的体现,介绍了先行发生原则的规则及使用,还了解了线程在Java语言中是如何实现的。
  第13章 介绍了线程安全涉及的概念和分类、同步实现的方式及虚拟机的底层运作原理,并且介绍了虚拟机实现高效并发所采取的一系列锁优化措施。
参考资料
  本书名为“深入理解Java虚拟机”,但要想深入理解虚拟机,仅凭一本书肯定是远远不够的,读者可以通过以下信息找到更多关于Java虚拟机方面的资料。我在写作此书的时候,也从下面这些参考资料中获得了很大的帮助。
  (1)书籍
   《The Java Virtual Machine Specification,Java SE 7 Edition》
  要学习虚拟机,无论如何都必须掌握“Java虚拟机规范”。这本书的概念和细节描述与Sun的早期虚拟机(Sun Classic VM)高度吻合,不过,随着技术的发展,高性能虚拟机真正的细节实现方式已经渐渐与虚拟机规范所描述的差距越来越大,如果只能选择一本参考书来了解虚拟机,那我推荐这本书。此书的Java SE 7版在2011年7月出版发行,这是自1999年发布的《Java虚拟机规范(第2版)》以来的第一次版本更新。笔者对Java SE 7版的全文进行了翻译,并与原书一样在网上免费发布了全文PDF。
   《The Java Language Specification,Java SE 7 Edition》
  虽然虚拟机并不是Java语言专有的,但是了解Java语言的各种细节规定对理解虚拟机的行为也是很有帮助的,它与上一本《Java虚拟机规范》都是Sun官方出品的书籍,而且这本书还是由Java之父James Gosling亲自执笔撰写的。这本书也与《Java虚拟机规范》一样,可以在官方网站完全免费下载到全文PDF,但暂时没有中文译本,《Java语言规范(第3版)》于2005年7月由机械工业出版社引进出版。
   《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虚拟机的中文图书。
   《Java Performance》
  《Java Performance》是“The Java”系列(许多人都读过该系列中最出名的《Effective Java》)图书中最新的一本,2011年10月出版,暂时没有中文版。这本书并非全部都围绕Java虚拟机(只有第3、4、7章直接与Java虚拟机相关),而是从操作系统到基于Java的上层程序性能度量和调优的全面介绍,其中涉及Java虚拟机的内容具备一定的深度和可实践性。
  (2)网站资源
   高级语言虚拟机圈子:http://hllvm.group.iteye.com/
里面有一些国内关于虚拟机的讨论,并不只限于JVM,而是涉及对所有的高级语言虚拟机(High-Level Language Virtual Machine)的讨论,但该网站建立在ITEye上,自然还是以讨论Java虚拟机为主。圈主RednaxelaFX(莫枢)的博客(http://rednaxelafx.iteye.com/)是另外一个非常有价值的虚拟机及编译原理等资料的分享园地。
   HotSpot Internals:https://wikis.oracle.com/display/HotSpotInternals/Home
一个关于OpenJDK的Wiki网站,许多文章都由JDK的开发团队编写,更新较慢,但是仍然有很高的参考价值。
   The HotSpot Group:http://openjdk.java.net/groups/hotspot/
HotSpot组群,包含虚拟机开发、编译器、垃圾收集和运行时4个邮件组,其中有关于HotSpot虚拟机的最新讨论。
勘误和支持
  在本书交稿的时候,我并不像想象中的那样兴奋或放松,写作之时那种“战战兢兢、如履薄冰”的感觉依然萦绕在心头。在每一章、每一节落笔之时,我都在考虑如何才能把各个知识点更有条理地讲述出来,同时也在担心会不会由于自己理解有偏差而误导了读者。由于写作水平和写作时间所限,书中难免存在不妥之处,所以特地开通了一个读者邮箱(understandingjvm@gmail.com)与大家交流,大家如有任何意见或建议欢迎与我联系。相信写书与写程序一样,作品一定都是不完美的,因为不完美,我们才有不断追求完美的动力。
  本书第2版的勘误,将会在作者的博客(http://icyfenix.iteye.com/)中发布。欢迎读者在博客上留言。
致谢
  首先要感谢我的家人,在本书写作期间全靠他们对我的悉心照顾,才让我能够全身心地投入到写作之中,而无后顾之忧。
  同时要感谢我的工作单位远光软件,公司为我提供了宝贵的工作、学习和实践的环境,书中的许多知识点都来自于工作中的实践;也感谢与我一起工作的同事们,非常荣幸能与你们一起在这个富有激情的团队中共同奋斗。
  还要感谢Oracle公司虚拟机团队的莫枢,在百忙之中抽空审阅了本书,提出了许多宝贵的建议和意见。
  最后,感谢机械工业出版社华章分社的编辑,本书能够顺利出版离不开他们的敬业精神和一丝不苟的工作态度。

周志明

上架指导

计算机\程序设计

封底文字

Java 程序是如何运行的?Java虚拟机在其中扮演了怎样的角色?如何让Java程序具有更高的并发性?许多Java程序员都会诸如此类的疑问。无奈,国内在很长一段时间里都没有一本从实际应用的角度讲解Java虚拟机的著作,本书的出版可谓填补了这个空白。它从Java程序员的角度出发,系统地将Java程序运行过程中涉及的各种知识整合到了一起,并配以日常工作中可能会碰到的疑难案例,引领读者轻松踏上探索Java虚拟机的旅途,是广大对Java虚拟机感兴趣的读者的福音!
——莫枢(RednaxelaFX)Oracle HotSpot VM编译器团队工程师


Java技术的通用性、高效性、平台移植性和安全性使之成为网络计算的理想技术,从普通的PC到数据中心、从游戏控制台到科学超级计算机、从手机到互联网,Java技术无处不在。Java虚拟机正是支撑和实现这一切的秘密武器,是它使得Java成为了一个强大的、一致的、稳定的、广阔的运行平台。“技术原理”和“实战运用”两条主线贯穿全书,在讲解Java虚拟机的工作原理和核心知识的同时,还用通俗的语言和具有代表性的案例讲述了Java虚拟机中与应用程序开发关系最为密切的内容。通过本书,大家可以用一种相对较轻松的方式来学习和探索虚拟机运作的秘密。
第2版与第1版的区别:
(1)根据最新的JDK1.7对第1版内容进行了全面的修订和补充,增加了很多新的内容,如JDK 1.7中新加入的G1收集器、JSR-292 InvokeDynamic(对非Java语言的调用支持)等内容;
(2)应部分读者的要求,介绍了OpenJDK的阅读、编译与调试方法,对OpenJDK的源代码进行了更多更深入的分析;
(3)实践性进一步增强,增加了许多处理各种常见JVM问题的技巧和最佳实践,如GC日志的分析,以及JIT编译器代码优化过程和生成代码的分析等;
(4)增加了若干处理JVM问题的实践案例;
(5)修正了第1版中的50余处错误的、有歧义的和不完整的描述。

作者简介

周志明 著:暂无简介

图书目录

前言
第一部分 走近Java
第1章 走近Java / 2
1.1 概述 / 2
1.2 Java技术体系 / 3
1.3 Java发展史 / 5
1.4 Java虚拟机发展史 / 9
1.4.1 Sun Classic / Exact VM / 9
1.4.2 Sun HotSpot VM / 11
1.4.3 Sun Mobile-Embedded VM / Meta-Circular VM / 12
1.4.4 BEA JRockit / IBM J9 VM / 13
1.4.5 Azul VM / BEA Liquid VM / 14
1.4.6 Apache Harmony / Google Android Dalvik VM / 14
1.4.7 Microsoft JVM及其他 / 15
1.5 展望Java技术的未来 / 16
1.5.1 模块化 / 17
1.5.2 混合语言 / 17
1.5.3 多核并行 / 19
1.5.4 进一步丰富语法 / 20
1.5.5 64位虚拟机 / 21
1.6 实战:自己编译JDK / 22
1.6.1 获取JDK源码 / 22
1.6.2 系统需求 / 24
1.6.3 构建编译环境 / 25
1.6.4 进行编译 / 26
1.6.5 在IDE工具中进行源码调试 / 31
1.7 本章小结 / 35
第二部分 自动内存管理机制
第2章 Java内存区域与内存溢出异常 / 38
2.1 概述 / 38
2.2 运行时数据区域 / 38
2.2.1 程序计数器 / 39
2.2.2 Java虚拟机栈 / 39
2.2.3 本地方法栈 / 40
2.2.4 Java堆 / 41
2.2.5 方法区 / 41
2.2.6 运行时常量池 / 42
2.2.7 直接内存 / 43
2.3 HotSpot虚拟机对象探秘 / 43
2.3.1 对象的创建 / 44
2.3.2 对象的内存布局 / 47
2.3.3 对象的访问定位 / 48
2.4 实战:OutOfMemoryError异常 / 50
2.4.1 Java堆溢出 / 51
2.4.2 虚拟机栈和本地方法栈溢出 / 53
2.4.3 方法区和运行时常量池溢出 / 56
2.4.4 本机直接内存溢出 / 59
2.5 本章小结 / 60
第3章 垃圾收集器与内存分配策略 / 61
3.1 概述 / 61
3.2 对象已死吗 / 62
3.2.1 引用计数算法 / 62
3.2.2 可达性分析算法 / 64
3.2.3 再谈引用 / 65
3.2.4 生存还是死亡 / 66
3.2.5 回收方法区 / 68
3.3 垃圾收集算法 / 69
3.3.1 标记-清除算法 / 69
3.3.2 复制算法 / 70
3.3.3 标记-整理算法 / 71
3.3.4 分代收集算法 / 72
3.4 HotSpot的算法实现 / 72
3.4.1 枚举根节点 / 72
3.4.2 安全点 / 73
3.4.3 安全区域 / 74
3.5 垃圾收集器 / 75
3.5.1 Serial收集器 / 76
3.5.2 ParNew收集器 / 77
3.5.3 Parallel Scavenge收集器 / 79
3.5.4 Serial Old收集器 / 80
3.5.5 Parallel Old收集器 / 80
3.5.6 CMS收集器 / 81
3.5.7 G1收集器 / 84
3.5.8 理解GC日志 / 89
3.5.9 垃圾收集器参数总结 / 90
3.6 内存分配与回收策略 / 91
3.6.1 对象优先在Eden分配 / 91
3.6.2 大对象直接进入老年代 / 93
3.6.3 长期存活的对象将进入老年代 / 95
3.6.4 动态对象年龄判定 / 97
3.6.5 空间分配担保 / 98
3.7 本章小结 / 100
第4章 虚拟机性能监控与故障处理工具 / 101
4.1 概述 / 101
4.2 JDK的命令行工具 / 101
4.2.1 jps:虚拟机进程状况工具 / 104
4.2.2 jstat:虚拟机统计信息监视工具 / 105
4.2.3 jinfo:Java配置信息工具 / 106
4.2.4 jmap:Java内存映像工具 / 107
4.2.5 jhat:虚拟机堆转储快照分析工具 / 108
4.2.6 jstack:Java堆栈跟踪工具 / 109
4.2.7 HSDIS:JIT生成代码反汇编 / 111
4.3 JDK的可视化工具 / 114
4.3.1 JConsole:Java监视与管理控制台 / 115
4.3.2 VisualVM:多合一故障处理工具 / 122
4.4 本章小结 / 131
第5章 调优案例分析与实战 / 132
5.1 概述 / 132
5.2 案例分析 / 132
5.2.1 高性能硬件上的程序部署策略 / 132
5.2.2 集群间同步导致的内存溢出 / 135
5.2.3 堆外内存导致的溢出错误 / 136
5.2.4 外部命令导致系统缓慢 / 137
5.2.5 服务器JVM进程崩溃 / 138
5.2.6 不恰当数据结构导致内存占用过大 / 139
5.2.7 由Windows虚拟内存导致的长时间停顿 / 141
5.3 实战:Eclipse运行速度调优 / 142
5.3.1 调优前的程序运行状态 / 142
5.3.2 升级JDK 1.6的性能变化及兼容问题 / 145
5.3.3 编译时间和类加载时间的优化 / 150
5.3.4 调整内存设置控制垃圾收集频率 / 153
5.3.5 选择收集器降低延迟 / 157
5.4 本章小结 / 160
第三部分 虚拟机执行子系统
第6章 类文件结构 / 162
6.1 概述 / 162
6.2 无关性的基石 / 162
6.3 Class类文件的结构 / 164
6.3.1 魔数与Class文件的版本 / 166
6.3.2 常量池 / 167
6.3.3 访问标志 / 173
6.3.4 类索引、父类索引与接口索引集合 / 174
6.3.5 字段表集合 / 175
6.3.6 方法表集合 / 178
6.3.7 属性表集合 / 180
6.4 字节码指令简介 / 196
6.4.1 字节码与数据类型 / 197
6.4.2 加载和存储指令 / 199
6.4.3 运算指令 / 200
6.4.4 类型转换指令 / 202
6.4.5 对象创建与访问指令 / 203
6.4.6 操作数栈管理指令 / 203
6.4.7 控制转移指令 / 204
6.4.8 方法调用和返回指令 / 204
6.4.9 异常处理指令 / 205
6.4.10 同步指令 / 205
6.5 公有设计和私有实现 / 206
6.6 Class文件结构的发展 / 207
6.7 本章小结 / 208
第7章 虚拟机类加载机制 / 209
7.1 概述 / 209
7.2 类加载的时机 / 210
7.3 类加载的过程 / 214
7.3.1 加载 / 214
7.3.2 验证 / 216
7.3.3 准备 / 219
7.3.4 解析 / 220
7.3.5 初始化 / 225
7.4 类加载器 / 227
7.4.1 类与类加载器 / 228
7.4.2 双亲委派模型 / 229
7.4.3 破坏双亲委派模型 / 233
7.5 本章小结 / 235
第8章 虚拟机字节码执行引擎 / 236
8.1 概述 / 236
8.2 运行时栈帧结构 / 236
8.2.1 局部变量表 / 238
8.2.2 操作数栈 / 242
8.2.3 动态连接 / 243
8.2.4 方法返回地址 / 243
8.2.5 附加信息 / 244
8.3 方法调用 / 244
8.3.1 解析 / 244
8.3.2 分派 / 246
8.3.3 动态类型语言支持 / 258
8.4 基于栈的字节码解释执行引擎 / 269
8.4.1 解释执行 / 269
8.4.2 基于栈的指令集与基于寄存器的指令集 / 270
8.4.3 基于栈的解释器执行过程 / 272
8.5 本章小结 / 275
第9章 类加载及执行子系统的案例与实战 / 276
9.1 概述 / 276
9.2 案例分析 / 276
9.2.1 Tomcat:正统的类加载器架构 / 276
9.2.2 OSGi:灵活的类加载器架构 / 279
9.2.3 字节码生成技术与动态代理的实现 / 282
9.2.4 Retrotranslator:跨越JDK版本 / 286
9.3 实战:自己动手实现远程执行功能 / 289
9.3.1 目标 / 290
9.3.2 思路 / 290
9.3.3 实现 / 291
9.3.4 验证 / 298
9.4 本章小结 / 299
第四部分 程序编译与代码优化
第10章 早期(编译期)优化 / 302
10.1 概述 / 302
10.2 Javac编译器 / 303
10.2.1 Javac的源码与调试 / 303
10.2.2 解析与填充符号表 / 305
10.2.3 注解处理器 / 307
10.2.4 语义分析与字节码生成 / 307
10.3 Java语法糖的味道 / 311
10.3.1 泛型与类型擦除 / 311
10.3.2 自动装箱、拆箱与遍历循环 / 315
10.3.3 条件编译 / 317
10.4 实战:插入式注解处理器 / 318
10.4.1 实战目标 / 318
10.4.2 代码实现 / 319
10.4.3 运行与测试 / 326
10.4.4 其他应用案例 / 327
10.5 本章小结 / 328
第11章 晚期(运行期)优化 / 329
11.1 概述 / 329
11.2 HotSpot虚拟机内的即时编译器 / 329
11.2.1 解释器与编译器 / 330
11.2.2 编译对象与触发条件 / 332
11.2.3 编译过程 / 337
11.2.4 查看及分析即时编译结果 / 339
11.3 编译优化技术 / 345
11.3.1 优化技术概览 / 346
11.3.2 公共子表达式消除 / 350
11.3.3 数组边界检查消除 / 351
11.3.4 方法内联 / 352
11.3.5 逃逸分析 / 354
11.4 Java与C/C++的编译器对比 / 356
11.5 本章小结 / 358
第五部分 高效并发
第12章 Java内存模型与线程 / 360
12.1 概述 / 360
12.2 硬件的效率与一致性 / 361
12.3 Java内存模型 / 362
12.3.1 主内存与工作内存 / 363
12.3.2 内存间交互操作 / 364
12.3.3 对于volatile型变量的特殊规则 / 366
12.3.4 对于long和double型变量的特殊规则 / 372
12.3.5 原子性、可见性与有序性 / 373
12.3.6 先行发生原则 / 375
12.4 Java与线程 / 378
12.4.1 线程的实现 / 378
12.4.2 Java线程调度 / 381
12.4.3 状态转换 / 383
12.5 本章小结 / 384
第13章 线程安全与锁优化 / 385
13.1 概述 / 385
13.2 线程安全 / 385
13.2.1 Java语言中的线程安全 / 386
13.2.2 线程安全的实现方法 / 390
13.3 锁优化 / 397
13.3.1 自旋锁与自适应自旋 / 398
13.3.2 锁消除 / 398
13.3.3 锁粗化 / 400
13.3.4 轻量级锁 / 400
13.3.5 偏向锁 / 402
13.4 本章小结 / 403
附  录
附录A 编译Windows版的OpenJDK / 406
附录B 虚拟机字节码指令表 / 414
附录C HotSpot虚拟机主要参数表 / 420
附录D 对象查询语言(OQL)简介 / 424
附录E JDK历史版本轨迹 / 430

教学资源推荐
作者: 邱李华,曹青,郭志强
作者: 杨树林 胡洁萍 编著
作者: 郑晓薇 编著
作者: Patrick Henry Winston, Sundar Narasimhan
参考读物推荐
作者: [加]约瑟夫·豪斯(Joseph Howse),[爱]乔·米尼奇诺(Joe Minichino) 著
作者: Julie C. Meloni