实战Java虚拟机:JVM故障诊断与性能优化(第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

前言

关于Java生态圈

Java是目前应用最广泛的软件开发平台之一。随着Java及Java社区的不断壮大,Java也早已不再是简简单单的一门计算机语言了,它更是一个平台、一种文化、一个社区。

作为一个平台,Java虚拟机扮演着举足轻重的作用。除了Java语言,任何一种能够被编译成字节码的计算机语言都属于Java这个平台。Groovy、Scala、JRuby、Kotlin等都是Java平台的一部分,它们依赖于Java虚拟机,同时,Java平台也因为它们变得更加丰富多彩。

作为一种文化,Java几乎成了“开源”的代名词。在Java程序中,有着数不清的开源软件和框架,如Tomcat、Struts、Hibernate、Spring等。就连JDK和JVM自身也有不少开源的实现,如OpenJDK、Harmony。可以说,“共享”的精神在Java世界里体现得淋漓尽致。

作为一个社区,Java拥有无数的开发人员,有数不清的论坛和资料。从桌面应用软件、嵌入式开发到企业级应用、后台服务器、中间件,都可以看到Java的身影。其应用形式之复杂、参与人数之众多也令人咋舌。可以说,Java社区俨然已经成为一个良好而庞大的生态系统,而本书,将主要介绍这个生态系统的核心——Java虚拟机

第2版的重点修订

作者希望本书第2版的内容能够涵盖JDK 7~JDK10,所以特做如下修订:

· JDK 10 源码环境的下载与搭建。

· JDK 10 JVM的调试方法介绍。

· JDK 10 运行参数的演变。

· JDK 10用G1垃圾回收器替代CMS垃圾回收器,成为默认的垃圾回收器。

· JDK 10调试工具的更新,废除功能类似的调试工具,重点推荐使用Visual VM。

本书的体系结构

本书立足于实际开发,又不缺乏理论介绍,力求通俗易懂、循序渐进。全书共分为11章。

第1章综述,介绍了Java虚拟机的概念、定义,讲解了Java语言规范和Java虚拟机规范,最后还介绍了OpenJDK的调试方法。

第2章介绍了Java虚拟机的总体架构,说明了堆、栈、方法区等内存空间的作用和彼此之间的联系。

第3章介绍了Java虚拟机的常用配置参数,重点对垃圾回收跟踪参数、内存配置参数做了详细介绍,并给出了案例说明。

第4章从理论层面介绍了垃圾回收的算法,如引用计数、标记清除、标记压缩、复制算法等。本章是第5章的理论基础。

第5章基于垃圾回收的理论知识,进一步详细介绍了Java虚拟机中实际使用的各种垃圾回收器,包括串行回收器、并行回收器、CMS、G1等。

第6章介绍了Java虚拟机的性能监控和故障诊断工具,考虑到实用性,也介绍了系统级性能监控工具的使用,两者结合,可以更好地帮助读者处理实际问题。

第7章详细介绍了对Java堆的分析方法和案例,主要讲解了MAT和Visual VM两款工具的使用,以及各自OQL的编写方式。

第8章介绍了Java虚拟机对多线程,尤其是对锁的支持。本章不仅介绍了虚拟机内部锁的实现、优化机制,也给出了Java语言层面的一些锁优化思路,最后还介绍了无锁的并行控制方法。

第9章介绍了Java虚拟机的核心——Class文件结构,Class文件作为Java虚拟机的基石,有着举足轻重的作用,对深入理解Java虚拟机有着不可忽视的作用。

第10章介绍了Java虚拟机中类的装载系统,其中着重介绍了Java虚拟机中ClassLoader的实现及设计模式。

第11章介绍了Java虚拟机的执行系统和字节码。为了帮助读者更快、更好地理解Java字节码,本章对字节码进行了分类讲解,并且理论联系实际,给出了通过ASM框架进行字节码注入的案例。

本书特色

本书的主要特点有:

· 结构清晰。本书采用从整体到局部的视角,首先,第1、2章介绍了Java虚拟机的整体概况和结构。接着步步为营,每一章节对应单独的知识点,力求展示虚拟机的全貌。

· 理论结合实战。本书不甘心于简单地枚举理论知识,在每一个理论背后,都给出了演示示例供读者参考,帮助读者更好地消化这些理论。比如,在对Class文件结构和字节码的介绍中,不仅仅简单地给出了理论说明,更是使用ASM框架将这些理论应用于实践,尽可能地做到理论与实践结合。

· 专注专业。本书着眼于Java虚拟机,对Java虚拟机的原理和实践做了丰富的介绍,包括但不限于体系结构、虚拟机的调试方式、常用参数、垃圾回收系统、Class文件结构、执行系统等,力求从多角度更专业地对Java虚拟机进行探讨。

· 通俗易懂。本书依然服务于广大虚拟机初学者,尽量避免采用过于理论化的描述方式,简单的白话文风格贯穿全书,尽量使读者在阅读过程中少盲点、无盲点。

· 技术全面。纵横Windows和Linux双系统下的性能诊断、涉及32位系统和64位系统的优化比较、贯穿从JDK 1.5到JDK 10的优化演进。

适合阅读人群

虽然本书讲解力求通俗,但要通读本书并取得良好的学习效果,要求读者需要具备基本的Java知识或者一定的编程经验。因此,本书适合以下读者:

· 拥有一定开发经验的Java平台开发人员(Java、Scala、JRuby等)。

· 软件设计师、架构师。

· 系统调优人员。

· 有一定的Java编程基础并希望进一步理解Java的程序员。

· 虚拟机爱好者,JVM实践者。

本书的约定

本书在叙述过程中,有如下约定:

· 本书中所述的JDK 1.5、JDK 1.6、JDK 1.7、JDK 1.8、JDK 1.9、JDK 1.10等同于JDK 5、JDK 6、JDK 7、JDK 8、JDK 9、JDK 10。

· 如无特殊说明,Java虚拟机均指HotSpot虚拟机。

· 如无特殊说明,本书的程序、示例均在JDK 7~JDK 10环境中运行。

联系作者

本书的写作过程远比想象的艰辛,为了让全书能够更清楚、更正确地表达和论述,我经历了好多个不眠之夜,即使现在回想起来,也忍不住会打个寒战。由于写作水平的限制,书中难免会有不妥之处,望读者谅解。

为此,如果读者有任何疑问或者建议,非常欢迎大家加入QQ群254693571,一起探讨学习中的困难、分享学习的经验,我期待与大家一起交流、共同进步。同时,也希望大家可以关注我的博客http://www.uucode.net/。

感谢

这本书能够面世,是因为得到了众人的支持。首先,要感谢我的妻子,她始终不辞辛劳,毫无怨言地对我照顾有加,才让我得以腾出大量时间,并可以安心工作。其次,要感谢编辑为我一次又一次地审稿改错、批评指正,才让本书逐步完善。最后,感谢我的母亲30年如一日对我的体贴和关心。

特别感谢网友千马奕在JDK 1.9、JDK1.10下对本书所做的测试和修订。