如何阅读本书

本书-共分为五个部分:走近Java、自动内存管理机制、虛拟机执行子系统、程序编译与代码优化、高效并发。各部分基本上是互相独立的,没有必然的前后依赖关系,读者可以从任何- -个感兴趣的专题开始阅读,但是每个部分中的各个章节间有先后顺序。本书并没有假设读者在Java领域具备很专业的技术水平,因此在保证逻辑准确的前提下,尽量用通俗的语言和案例讲述虚拟机中与开发的关系最为密切的内容。当然,学习虚拟机技术本身就需要读者有一定的基础,且本书的读者定位是中、高级程序员,因此本书假设读者自己了解- -些常用的开发框架、Java API和Java语法等基础知识。笔者希望读者在阅读本书的同时,把本书中的实践内容亲自验证一遍, 其中用到的代码清单可以从华章网站(ttp://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)则改为JDK5、JDK6和JDK7的命名方式,为行文-致,本书所有场合统-采用开发版本号的命名方式。0由于版面关系,本书中的许多示例代码都没有遵循最优的代码编写风格,如使用的流没有关闭流等,请读者在阅读时注意这一一点。如果没有特殊说明,本书中所有讨论都是以Sun JDK 1.7 为技术平台的。不过如果有某个特性在各个版本间的变化较大,- -般都会说明它在各个版本间的差异。

内容特色.

第一部分走近Java

本书的第一部分为后文的讲解建立了良好的基础。尽管工解Java技术的来龙去脉,以及编译自己的OpenJDK难于读者理解Java虚拟机并不是必需的,但是这些准备过程可以为走近Java技术和Java虚拟机提供很好的引导。第一部分只有第1章:
第1章      介绍了Java技术体系的过去、现在和未来的一- 些发展趋势,并介绍了如何独立
地编译一个OpenJDK 7。

第二部分自 动内存管理机制

因为程序员把内存控制的权力交给了Java 虚拟机,所以可以在编码的时候享受自动内存管理的诸多优势,不过也正是这个原因,- -且出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会成为一-项异常艰难的工作。

第二部分包括第2~ 5章: 

第2章   讲解 了虚拟机中内存是如何划分的,以及哪部分区域、什么样的代码和操作可能导致内存溢出异常,并讲解了各个区域出现内存溢出异常的常见原因。

第3章分析了垃圾收集的算法和JDK1.7中提供的几款垃圾收集器的特点及运作原理。通过代码实例验证了Java虚拟机中自动内存分配及回收的主要规则。

第4章介绍了随JDK发布的6个命令行工具与两个可视化的故障处理工具的使用方法。
第5章与读 者分享了几个比较有代表性的实际案例,还准备了一-个所有开发人员都能“亲身实战”的练习,读者可通过实践来获得故障处理和调优的经验。

第三部分 虚拟机执行子系统

执行子系统是脆拟机中必不可少的组成部分,了解了虚拟机如何执行程序,才能写出更优秀的代码。

第三部分包括第6~ 9章:

第6章讲解了 Class 文件结构中的各个组成部分,以及每个部分的定义、数据结构和使用方法,以实战的方式演示了Class 文件的数据是如何存储和访问的。
第7章介绍了类加载过程的“加载”、“验证”、 “准备”、“解析”和“初始化”s个阶段中虚拟机分别执行了哪些动作,还介绍了类加载器的工作原理及其对虚拟机的意义。
第8章分析了虚拟机在执行代码时如何找到正确的方法,如何执行方法内的字节码,以及执行代码时涉及的内存结构。
第9章通过4 个类加载及执行子系统的案例,分享了使用类加载器和处理字节码的一些值得欣赏和借鉴的思路,并通过一个实战练习来加深对前面理论知识的理解。

第四部分  程序编译与代码优化

Java程序从源码编译成字节码和从字节码编译成本地机器码的这两个过程,合并起来其实就等同于-个传统编译器所执行的编译过程。

第四部分包括第10~ 11章:

第10章分析了 Java语言中泛型、主动装箱和拆箱、条件编译等多种语法糖的前因后果,并通过实战演示了如何使用插人式注解处理器来实现- -个检 查程序命名规范的编译器插件。
第11章讲解了虚拟机的热点探测方法、HotSpot的即时编译器、编译触发条件,以及如何从虚拟机外部观察和分析JIT编译的数据和结果,此外,还讲解了几种常见的编译优化技术。
第五部分高效并发
Java语言和虚拟机提供了原生的、完善的多线程支持,这使得它天生就适合开发多线程并发的应用程序。不过我们不能期望系统来完成所有并发相关的处理,了 解并发的内幕也是成为-一个高级程序员不可缺少的课程。第五部分包括第12~ 13章:
第12章讲解了 虚拟机Java内存模型的结构及操作,以及原子性、可见性和有序性在Java内存模型中的体现,介绍了先行发生原则的规则及使用,还了解了线程在Java语言中是如何实现的。
第13章介绍了 线程安全涉及的概念和分类、同步实现的方式及虚拟机的底层运作原理,并且介绍了虚拟机实现高效并发所采取的- - 系列锁优化措施。