本书的主要特点有:
1. 结构清晰。步步为营,每一章节对应一个单独的知识点,力求展示虚拟机的全貌。
2. 理论结合实战。在每一个理论背后,都给出了演示示例供读者参考。
3. 专注专业。包括但不限于体系结构、虚拟机的调试方式、常用参数、垃圾回收系统、Class文件结构、执行系统等,力求从多角度更专业地对Java虚拟机进行探讨。
4. 通俗易懂。简单的白话文风格贯穿全书,尽量做到读者在阅读过程中少盲点、无盲点。
5. 技术全面。纵横Windows和Linux双系统下的性能诊断、涉及32位系统和64位系统的优化比较、贯穿从JDK 1.5到JDK 1.8的优化演进。
推荐购买:
随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为了一个充满活力的生态圈。《实战Java虚拟机——JVM故障诊断与性能优化》将通过200余示例详细介绍Java虚拟机中的各种参数配置、故障排查、性能监控以及性能优化。
《实战Java虚拟机——JVM故障诊断与性能优化》共11章。第1~3章介绍了Java虚拟机的定义、总体架构、常用配置参数。第4~5章介绍了垃圾回收的算法和各种垃圾回收器。第6章介绍了Java虚拟机的性能监控和故障诊断工具。第7章详细介绍了对Java堆的分析方法和案例。第8章介绍了Java虚拟机对多线程,尤其是对锁的支持。第9~10章介绍了Java虚拟机的核心——Class文件结构,以及Java虚拟机中类的装载系统。第11章介绍了Java虚拟机的执行系统和字节码,并给出了通过ASM框架进行字节码注入的案例。
《实战Java虚拟机——JVM故障诊断与性能优化》不仅适合Java程序员,还适合任何一名工作于Java虚拟机之上的研发人员、软件设计师、架构师。
葛一鸣,51CTO特约讲师,国家认证系统分析师,获得Oracle OCP认证。长期从事Java软件开发工作,对Java程序设计、JVM有深入的研究,对设计模式、人工智能、神经网络、数据挖掘等技术有浓厚兴趣,著有《自己动手写神经网路》电子书,也开设了在线的《深入浅出Java虚拟机——入门篇》培训课程。
★对Java程序员来说,Java虚拟机(JVM)可以说是既熟悉又神秘,很少有Java程序员能够抑制自己探究它的冲动。可惜分析JVM故障诊断与性能优化的书籍(尤其是国内出版的)简直少之又少。本书的出版可谓研究JVM的程序员的福音,作者注重理论联系实际,对于理论性较强的章节和知识点安排了大量的实践案例来说明和进行实际操作,具有非常强的实践指导意义。同时本书配套操作视频《深入浅出Java虚拟机——入门篇》在51CTO学院发布后受到了51CTO社区广大开发者和爱好者的好评和认可,所以,强烈推荐本书给爱好JVM的你!
——51CTO学院高级运营经理 曹亚莉
第1章 初探Java虚拟机 1
1.1 知根知底:追溯Java的发展历程 2
1.1.1 那些依托Java虚拟机的语言大咖们 2
1.1.2 Java发展史上的里程碑 2
1.2 跨平台的真相:Java虚拟机来做中介 4
1.2.1 理解Java虚拟机的原理 4
1.2.2 看清Java虚拟机的种类 5
1.3 一切看我的:Java语言规范 6
1.3.1 词法的定义 6
1.3.2 语法的定义 7
1.3.3 数据类型的定义 8
1.3.4 Java语言规范总结 9
1.4 一切听我的:Java虚拟机规范 9
1.5 数字编码就是计算机世界的水和电 10
1.5.1 整数在Java虚拟机中的表示 10
1.5.2 浮点数在Java虚拟机中的表示 12
1.6 抛砖引玉:编译和调试虚拟机 14
1.7 小结 19
第2章 认识Java虚拟机的基本结构 20
2.1 谋全局者才能成大器:看穿Java虚拟机的架构 20
2.2 小参数能解决大问题:学会设置Java虚拟机的参数 22
2.3 对象去哪儿:辨清Java堆 23
2.4 函数如何调用:出入Java栈 25
2.4.1 局部变量表 27
2.4.2 操作数栈 32
2.4.3 帧数据区 32
2.4.4 栈上分配 33
2.5 类去哪儿了:识别方法区 35
2.6 小结 37
第3章 常用Java虚拟机参数 38
3.1 一切运行都有迹可循:掌握跟踪调试参数 38
3.1.1 跟踪垃圾回收——读懂虚拟机日志 39
3.1.2 类加载/卸载的跟踪 42
3.1.3 系统参数查看 44
3.2 让性能飞起来:学习堆的配置参数 45
3.2.1 最大堆和初始堆的设置 45
3.2.2 新生代的配置 49
3.2.3 堆溢出处理 52
3.3 别让性能有缺口:了解非堆内存的参数配置 54
3.3.1 方法区配置 55
3.3.2 栈配置 55
3.3.3 直接内存配置 55
3.4 Client和Server二选一:虚拟机的工作模式 58
3.5 小结 59
第4章 垃圾回收概念与算法 60
4.1 内存管理清洁工:认识垃圾回收 60
4.2 清洁工具大PK:讨论常用的垃圾回收算法 61
4.2.1 引用计数法(Reference Counting) 62
4.2.2 标记清除法(Mark-Sweep) 63
4.2.3 复制算法(Copying) 64
4.2.4 标记压缩法(Mark-Compact) 66
4.2.5 分代算法(Generational Collecting) 67
4.2.6 分区算法(Region) 68
4.3 谁才是真正的垃圾:判断可触及性 69
4.3.1 对象的复活 69
4.3.2 引用和可触及性的强度 71
4.3.3 软引用——可被回收的引用 72
4.3.4 弱引用——发现即回收 76
4.3.5 虚引用——对象回收跟踪 77
4.4 垃圾回收时的停顿现象:Stop-The-World案例实战 79
4.5 小结
255
......
11.6 跑得再快点:静态编译优化
当使用javac把Java源码转为字节码时,编译器会有一些优化以获得更好的性能。目前,对于执行的字节码会从两处进行优化:
第一,就是使用javac编译时;
第二,就是通过JIT(Just-In-Time)即时编译,在运行时。
目前,大量的优化工作都围绕着JIT展开,比如方法内联、栈上替换等。将优化工作从javac前端移到后端的好处是非常明显的,这样,所有基于Java平台的语言都能共享这种优化带来的好处。将大量的优化只放置于javac前端,那么只有Java语言可以利用这种优化方式。但即便如此,开发人员也必须要了解一些javac的常用优化方法。
11.6.1 编译时计算
如果在程序中出现了计算表达式,如果表达式的值能够在编译时确定,那么表达式的计算会提前到编译阶段,而不是在运行时计算。
【示例11-30】很多时候,为了增强代码的可读性,往往不会把最终的数值写在代码中,通常倾向于把计算过程写在代码里。比如下面代码:
for(int i=0;i<60*60*24*1000;i++){
//do sth.
}
循环次数为60*60*24*1000次,通常这个表达式可能是用来计算天时分秒的乘积。看到这段代码,可能会让人产生一种怀疑,是不是这个计算每次循环都要进行一次呢?如果是的话,是不是更应该写成:
for(int i=0;i< 86400000;i++){
//do sth.
}
或者一定要保留计算表达式的话:
int count=60*60*24*1000;
for(int i=0;i< count;i++){
//do sth.
}
读者也许会认为,上述代码先计算了表达式乘积,并保留这个值,以避免每次循环都重复计算。
实际上,后两段代码的担心是多余的,因为在编译的时候,对于给定的表达式会自动计算并给出结果。本例中第一段代码生成的字节码如下:
#20 = Integer 86400000
0: iconst_0
1: istore_1
2: goto 8
5: iinc 1, 1
8: iload_1
9: ldc #20 // int 86400000
11: if_icmplt 5
14: return
可以看到,用于控制循环次数上限的整数在字节码中并非经过计算得来,而是保存在常量池中,并直接使用,其作用是用来判定是否可以继续循环。可见,对于常量表达式,可以大胆地使用而无需担心影响系统性能。
【示例11-31】另一个常用的例子是字符串连接。有时候,如果一个字符串很长,通常会倾向于使用“+”号连接。由于字符串是不可变的对象,读者也许会认为使用类似A+B的方式连接字符串时,需要3个对象,即A、B和AB。下面再来看一个例子。
public static void createString(){
String info1="select * from test";
String info2="select * "+"from test";
String info3="select * ".concat("from test");
System.out.println(info1==info2);
System.out.println(info1==info3);
System.out.println(info2==info3);
System.out.println(info2==info3.intern());
}
上述代码中,info1是直接定义的字符,info2使用“+”号连接,生成字面量等于info1的字符串,info3使用String.concat()方法做连接生成。如果执行以上代码,输出如下:
true
false
false
true
可以看到,info1和info2是指向了同一个对象引用,而info3则是指向了不同的对象引用,但是info3的常量池引用地址就是info2。这说明info3是被实实在在构造出来的新的String对象,而info2的“+”号运算并未在运行时进行,否则也应该有新对象产生。查看它的部分字节码:
0: ldc #24; //String select * from test
2: astore_0
3: ldc #24; //String select * from test
5: astore_1
6: ldc #26; //String select *
8: ldc #28; //String from test
10: invokevirtual #30; //Method java/lang/String.concat:(Ljava/lang/String;) Ljava/lang/String;
13: astore_2
上述字节码中,第2行表示将常量池第24项存入第0个局部变量(info1),第5行表示将常量池第24项存入第1个局部变量(info2)。这里就解释了为什么程序会有这样的输出,因为在编译时,字符串连接已经完成。而对于后续的concat()函数,则没有这种优化,第10行的invokevirtual调用,就是说明了info3是在运行时被创建的。
因此,对于常量字符串连接,不能担心多写几个“+”号就会影响系统性能、多占用内存等,因为这些都会在编译器进行计算。
……
关于Java生态圈
Java是目前应用最为广泛的软件开发平台之一。随着Java以及Java社区的不断壮大,Java也早已不再是简简单单的一门计算机语言了,它更是一个平台、一种文化、一个社区。
作为一个平台,Java虚拟机扮演着举足轻重的作用。除了Java语言,任何一种能够被编译成字节码的计算机语言都属于Java这个平台。Groovy、Scala、JRuby等都是Java平台的一个部分,它们依赖于Java虚拟机,同时,Java平台也因为它们变得更加丰富多彩。
作为一种文化,Java几乎成为了“开源”的代名词。在Java程序中,有着数不清的开源软件和框架,如Tomcat、Struts、Hibernate、Spring等。就连JDK和JVM自身也有不少开源的实现,如OpenJDK、Harmony。可以说,“共享”的精神在Java世界里体现得淋漓尽致。
作为一个社区,Java拥有无数的开发人员,有数不清的论坛和资料。从桌面应用软件、嵌入式开发到企业级应用、后台服务器、中间件,都可以看到Java的身影。其应用形式之复杂、参与人数之众多也令人咋舌。可以说,Java社区已经俨然成为了一个良好而庞大的生态系统。
而本书,将主要介绍这个生态系统的核心——Java虚拟机。
本书的体系结构
本书立足于实际开发,又不缺乏理论介绍,力求通俗易懂、循序渐进。本书共分为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. 结构清晰。本书采用从整体到局部的视角,首先第1、2章介绍了Java虚拟机的整体概况和结构。接着步步为营,每一章节对应一个单独的知识点,力求展示虚拟机的全貌。
2. 理论结合实战。本书不甘心于简单地枚举理论知识,在每一个理论背后,都给出了演示示例供读者参考,帮助读者更好地消化这些理论。比如,在对Class文件结构和字节码的介绍中,不仅仅简单地给出了理论说明,更是使用ASM框架将这些理论应用于实践,尽可能地做到理论和实践结合。
3. 专注专业。本书着眼于Java虚拟机,对Java虚拟机的原理和实践做了丰富的介绍,包括但不限于体系结构、虚拟机的调试方式、常用参数、垃圾回收系统、Class文件结构、执行系统等,力求从多角度更专业地对Java虚拟机进行探讨。
4. 通俗易懂。本书依然服务于广大虚拟机初学者,尽量避免采用过于理论的描述方式,简单的白话文风格贯穿全书,尽量做到读者在阅读过程中少盲点、无盲点。
5. 技术全面。纵横Windows和Linux双系统下的性能诊断、涉及32位系统和64位系统的优化比较、贯穿从JDK 1.5到JDK 1.8的优化演进。
适合阅读人群
虽然本书力求通俗,但要通读本书并取得良好的学习效果,要求读者需要具备基本的Java知识或者一定的编程经验。因此,本书适合以下读者:
拥有一定开发经验的Java平台开发人员(Java、Scala、JRuby等)
软件设计师、架构师
系统调优人员
有一定的Java编程基础并希望进一步理解Java的程序员
虚拟机爱好者,JVM实践者
本书的约定
本书在叙述过程中,有如下约定:
本书中所述的JDK 1.5、JDK 1.6、JDK 1.7、JDK 1.8等同于JDK 5、JDK 6、JDK 7、JDK 8。
如无特殊说明,Java虚拟机均指HotSpot虚拟机。
如无特殊说明,本书的程序、示例均在JDK 1.7环境中运行。
本书赠送的课程优惠券,可以观看笔者在51CTO学院的JVM课程。
联系作者
本书的写作过程远比我想象的更艰辛,为了让全书能够更清楚、更正确地表达和论述,我经历了好多个不眠之夜,即使现在回想起来,也忍不住让我打个寒战。由于写作水平的限制,书中难免会有不妥之处,望读者谅解。
为此,如果读者有任何疑问或者建议,非常欢迎大家加入QQ群397196583,一起探讨学习中的困难、分享学习的经验,我期待与大家一起交流、共同进步。同时,也希望大家可以关注我的博客。
感谢
这本书能够面世,是因为得到了众人的支持。首先,要感谢我的妻子,她始终不辞辛劳,毫无怨言地对我照顾有加,才让我得以腾出大量时间,并可以安心工作。其次,要感谢小编为我一次又一次地审稿改错,批评指正,才能让本书逐步完善。最后,感谢我的母亲30年如一日对我的体贴和关心。
参与本书编写的还有宋玉红、关硕、安继宏、白慧、薛淑英、蒋玺、曹静、马玉杰、陈明明、张丽萍、任娜娜、李清艺、荆海霞、赵全利、孙迪,特此感谢!
葛一鸣
不得不说,这本书的书名非常有吸引力。“故障诊断”和“性能优化”是每一个Java开发者在实际工作中都绕不开的两个关键词。我经常在生产环境中遇到一些难以捉摸的性能问题,比如接口响应缓慢、系统吞吐量下降,甚至突然的宕机。这些问题往往涉及到JVM的深层机制,而我们往往只能依靠经验去猜测,效果不尽如人意。 我非常期待书中能够提供一套系统性的故障排查流程,从日志分析、线程 Dump、堆 Dump 等基础入手,一步步地引导读者找到问题的根源。特别希望书中能有关于如何分析GC日志的详细讲解,因为GC的频繁触发或者长时间停顿往往是性能问题的罪魁祸首。同时,我也希望书中能够分享一些 JVM 性能优化的“独门秘籍”,例如如何通过代码层面和 JVM 配置层面的结合,来达到最优的性能表现。
评分这本书的封面设计以及书名“实战Java虚拟机:JVM故障诊断与性能优化”就透露出一种深入骨髓的技术气息。在我多年的Java开发经验中,JVM的某些深层机制,特别是其在处理高并发场景下的表现,以及各种“看不见”的性能瓶颈,一直是我试图深入理解但又常常感到困惑的地方。这本书的出现,仿佛是为我指明了一盏明灯。 我尤其看重“故障诊断”这几个字。我们经常会遇到一些难以溯源的OOM(Out Of Memory)错误,或者CPU使用率异常飙升的情况,这时候如果没有一套系统性的排查思路,很容易陷入“大海捞针”的窘境。我希望这本书能够提供一套严谨而实用的故障排查流程,从JVM的日志分析、线程Dump解读,到堆Dump的深度挖掘,能够循序渐进地教会我如何“望闻问切”,精准定位问题所在。 同时,“性能优化”也正是我一直在追求的目标。从JVM参数的精细调优,到垃圾回收算法的选择与配置,再到线程安全和内存使用效率的提升,我希望能在这本书中找到行之有效的解决方案。我期待它能用大量的实战案例,将理论知识转化为可以直接应用于生产环境的技能,帮助我将Java应用程序的性能推向一个新的高度。
评分拿到这本书的时候,我最先翻阅的是关于Java内存模型的部分。一直以来,我对Java的内存管理都只是停留在“自动垃圾回收”的模糊概念上,并没有深入理解对象在内存中的生命周期、各个区域(堆、栈、方法区等)的作用,以及多线程环境下可能出现的可见性、原子性问题。这本书的标题中“实战”二字,让我对这部分内容充满了期待,希望它能用清晰易懂的语言,结合丰富的图示,将这些抽象的概念具象化,让我们能够真正理解“为什么”会出现某些内存相关的问题,而不仅仅是知道“如何”解决。 我尤其想了解JVM如何跟踪和管理对象的生命周期,垃圾回收算法的具体实现原理,比如分代回收、CMS、G1等,以及它们各自的优缺点和适用场景。书中如果能提供一些实用的工具,比如jvisualvm、jmap、jstack等的使用指南,并且教我们如何从这些工具的输出中解读出关键信息,那将是非常有价值的。我希望这本书能够帮助我建立起一套完整的JVM知识体系,从而在面对复杂的内存问题时,能够从容应对。
评分我一直对JVM内部的工作原理感到好奇,特别是它如何管理内存、执行字节码,以及如何进行垃圾回收。这本书的名字“实战Java虚拟机”立刻吸引了我,让我觉得它可能不仅仅是理论的堆砌,而是能提供一些实际操作的指导。我希望书中能够深入浅出地讲解JVM的各个组成部分,比如类加载器、内存区域、执行引擎等,并且通过生动的比喻和图示,让这些相对抽象的概念变得容易理解。 我特别关注书中关于性能优化的部分,因为在实际项目中,性能往往是衡量一个应用好坏的重要指标。我希望书中能够分享一些常见的性能瓶颈分析方法,比如如何通过监控工具来定位问题,以及如何针对性地进行优化,包括但不限于垃圾回收调优、线程池配置、内存泄漏排查等。我期待这本书能够帮助我建立起一套完整的JVM性能优化体系,让我能够写出更高效、更稳定的Java程序。
评分这本书的封面设计就充满了技术感,沉甸甸的纸张质感也让人觉得内容一定很扎实。我一直对Java虚拟机这个神秘的领域充满了好奇,尤其是在实际开发中,遇到各种各样的性能瓶颈和内存溢出问题时,总感觉抓不住问题的根源。这本书的名字就直接点出了核心——“故障诊断与性能优化”,这正是许多Java开发者在职业生涯中都会遇到的痛点。 我特别关注那些关于JVM调优的章节,想象着书中会详细讲解各种JVM参数的含义,以及如何根据实际情况来调整它们,比如堆内存的分配、垃圾回收器的选择和参数配置等等。我希望书中能够通过真实的案例,一步步地剖析问题,展示如何定位内存泄漏、CPU飙升等棘手问题,并给出切实可行的解决方案。这一点对于我们日常的开发和运维工作来说,无疑是雪中送炭。
评分我们的生活方式是什么时候回来呢,我们都在一起了。我在这里
评分挺好的!!!!!!
评分物流很快,书的质量也挺好,赞
评分内容翔实,可操作性强,值得深研。
评分错别字多了点,给我感觉好像是盗版书,难道不能多审核几次,是为赶时间出书而出书吗?不然买了你一本后面还会再买吗?
评分学习 学习 学习 不断地学习 好书
评分书还是不错的,不过为什么书好像被踩了一样,封面很多灰,明明就是不负责的态度处理我们的书籍。
评分这几天买9本专业书,一口气,书质量还可以,应该是正版
评分挺好用的东西用过很多次了值得购买
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 book.cndgn.com All Rights Reserved. 新城书站 版权所有