新書推薦:
《
冯友兰和青年谈心系列
》
售價:HK$
167.3
《
利他主义的生意:偏爱“非理性”的市场(英国《金融时报》推荐读物!)
》
售價:HK$
77.3
《
认知行为疗法:心理咨询的顶层设计
》
售價:HK$
99.7
《
FANUC工业机器人装调与维修
》
售價:HK$
99.7
《
吕著中国通史
》
售價:HK$
62.7
《
爱琴海的光芒 : 千年古希腊文明
》
售價:HK$
199.4
《
不被他人左右:基于阿德勒心理学的无压力工作法
》
售價:HK$
66.1
《
SDGSAT-1卫星热红外影像图集
》
售價:HK$
445.8
|
編輯推薦: |
★结构清晰。
采用从整体到局部的视角,每一章节对应单独的知识点,力求展示虚拟机的全貌。
★理论结合实战。
在每一个知识点后,都给出了演示示例供读者参考,帮助读者更好地消化
★专注专业。
对Java虚拟机的原理和实践做了丰富介绍,力求从多角度更专业地对JVM进行探讨。
★通俗易懂。
本书服务于广大虚拟机初学者,简单的白话文风格贯穿全书,使读者少盲点、无盲点。
★技术全面。
纵横Windows和Linux双系统下的性能诊断、涉及32位系统和64位系统的优化比较、贯穿从JDK 1.5到JDK 10的优化演进。
|
內容簡介: |
不管技术如何发展,Java依然是一个充满活力的生态圈,学习Java的人也越来越多,但多数人学习Java虚拟机(JVM)时都会遇到瓶颈。本书将通过200余个示例详细介绍JVM中的各种参数配置、故障排查、性能监控及性能优化,帮助Java人突破瓶颈。本书共11章,修订后版本涵盖Java 6~Java 10。第1~3章介绍了Java虚拟机的定义、总体架构、常用配置参数。第4~5章介绍了垃圾回收的算法和各种垃圾回收器。第6章介绍了Java虚拟机的性能监控和故障诊断工具。第7章详细介绍了对Java堆的分析方法和案例。第8章介绍了Java虚拟机对多线程,尤其是对锁的支持。第9~10章介绍了Java虚拟机的核心—Class文件结构,以及Java虚拟机中类的装载系统。第11章介绍了Java虚拟机的执行系统和字节码,并给出了通过ASM框架进行字节码注入的案例。本书不仅适合Java程序员阅读,还适合工作于Java虚拟机之上的研发人员、软件设计师、架构师阅读。
|
關於作者: |
葛一鸣:炼数成金特约讲师,国家认证系统分析师,获得Oracle OCP认证。长期从事Java软件开发工作,对Java程序设计、JVM有深入研究,对设计模式、人工智能、神经网络、数据挖掘等技术有浓厚兴趣,著有《实战Java虚拟机》一书,目前在Dataguru开设多门课程,包括Java并发、JVM、Git等。
|
目錄:
|
目录
第1章 初探Java虚拟机1
1.1知根知底:追溯Java的发展历程2
1.1.1那些依托Java虚拟机的语言大咖们2
1.1.2Java发展史上的里程碑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.4Java语言规范总结9
1.4一切听我的:Java虚拟机规范9
1.5数字编码就是计算机世界的水和电10
1.5.1整数在Java虚拟机中的表示10
1.5.2浮点数在Java虚拟机中的表示12
1.6抛砖引玉:编译和调试虚拟机14
1.7小结18
第2章 认识Java虚拟机的基本结构19
2.1谋全局者才能成大器:看穿Java虚拟机的架构19
2.2小参数能解决大问题:学会设置Java虚拟机的参数21
2.3对象去哪儿:辨清Java堆22
2.4函数如何调用:出入Java栈24
2.4.1局部变量表26
2.4.2操作数栈31
2.4.3帧数据区31
2.4.4栈上分配32
2.5类去哪儿了:识别方法区34
2.6小结36
第3章 常用Java虚拟机参数37
3.1一切运行都有迹可循:掌握跟踪调试参数37
3.1.1跟踪垃圾回收读懂虚拟机日志38
3.1.2类加载卸载的跟踪42
3.1.3查看系统参数45
3.2让性能飞起来:学习堆的配置参数45
3.2.1最大堆和初始堆的设置46
3.2.2新生代的配置49
3.2.3堆溢出处理53
3.3别让性能有缺口:了解非堆内存的参数配置54
3.3.1方法区配置55
3.3.2栈配置55
3.3.3直接内存配置55
3.4Client和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小结83
第5章 垃圾收集器和内存分配84
5.1一心一意一件事:串行回收器85
5.1.1新生代串行回收器85
5.1.2老年代串行回收器86
5.2人多力量大:并行回收器86
5.2.1新生代ParNew回收器87
5.2.2新生代ParallelGC回收器88
5.2.3老年代ParallelOldGC回收器89
5.3一心多用都不落下:CMS回收器(JDK 8及之前的版本)90
5.3.1CMS主要工作步骤90
5.3.2CMS主要的参数91
5.3.3CMS的日志分析93
5.3.4有关Class的回收94
5.4未来我做主:G1回收器(JDK 9及之后版本的默认回收器)95
5.4.1G1的内存划分和主要收集过程95
5.4.2G1的新生代GC96
5.4.3G1的并发标记周期97
5.4.4混合回收100
5.4.5必要时的Full GC102
5.4.6G1的日志102
5.4.7G1相关的参数106
5.5回眸:有关对象内存分配和回收的一些细节问题106
5.5.1禁用System.gc107
5.5.2System.gc使用并发回收107
5.5.3并行GC前额外触发的新生代GC109
5.5.4对象何时进入老年代109
5.5.5在TLAB上分配对象117
5.5.6finalize函数对垃圾回收的影响120
5.6温故又知新:常用的GC参数125
5.7动手才是真英雄:垃圾回收器对Tomcat性能影响的实验127
5.7.1配置实验环境127
5.7.2配置性能测试工具JMeter128
5.7.3配置Web应用服务器Tomcat131
5.7.4实战案例1初试串行回收器133
5.7.5实战案例2扩大堆以提升系统性能133
5.7.6实战案例3调整初始堆大小134
5.7.7实战案例4使用ParrellOldGC回收器135
5.7.8实战案例5使用较小堆提高GC压力135
5.7.9实战案例6测试ParallelOldGC的表现135
5.7.10实战案例7测试ParNew回收器的表现136
5.7.11实战案例8测试JDK 1.8的表现136
5.7.12实战案例9使用高版本虚拟机提升性能137
5.8小结137
第6章 性能监控工具138
6.1有我更高效:Linux下的性能监控工具139
6.1.1显示系统整体资源使用情况top命令139
6.1.2监控内存和CPUvmstat命令140
6.1.3监控IOiostat命令142
6.1.4多功能诊断器pidstat工具143
6.2用我更高效:Windows下的性能监控工具148
6.2.1任务管理器148
6.2.2perfmon性能监控工具150
6.2.3Process Explorer进程管理工具153
6.2.4pslist命令Windows下也有命令行工具155
6.3外科手术刀:JDK性能监控工具157
6.3.1查看Java进程jps命令158
6.3.2查看虚拟机运行时信息jstat命令159
6.3.3查看虚拟机参数jinfo命令162
6.3.4导出堆到文件jmap命令163
6.3.5JDK自带的堆分析工具jhat命令165
6.3.6查看线程堆栈jstack命令168
6.3.7远程主机信息收集jstatd命令171
6.3.8多功能命令行jcmd命令173
6.3.9性能统计工具hprof175
6.3.10扩展jps命令178
6.4我是你的眼:图形化虚拟机监控工具JConsole178
6.4.1JConsole连接Java程序179
6.4.2Java程序概况180
6.4.3内存监控180
6.4.4线程监控181
6.4.5类加载情况183
6.4.6虚拟机信息183
6.5一目了然:可视化性能监控工具Visual VM184
6.5.1Visual VM连接应用程序185
6.5.2监控应用程序概况186
6.5.3Thread Dump和分析187
6.5.4性能分析188
6.5.5内存快照分析190
6.5.6BTrace介绍191
6.6来自JRockit的礼物:虚拟机诊断工具Mission Control199
6.6.1MBean服务器199
6.6.2飞行记录器(Flight Recorder)201
6.7小结204
第7章 分析Java堆205
7.1对症才能下药:找到内存溢出的原因206
7.1.1堆溢出206
7.1.2直接内存溢出206
7.1.3过多线程导致OOM208
7.1.4永久区溢出210
7.1.5GC效率低下引起的OOM211
7.2无处不在的字符串:String在虚拟机中的实现211
7.2.1String对象的特点211
7.2.2有关String的内存泄漏213
7.2.3有关String常量池的位置216
7.3虚拟机也有内窥镜:使用MAT分析Java堆218
7.3.1初识MAT218
7.3.2浅堆和深堆221
7.3.3MAT堆分析案例解析222
7.3.4支配树(Dominator Tree)226
7.3.5Tomcat堆溢出分析227
7.4筛选堆对象:MAT对OQL的支持231
7.4.1Select子句231
7.4.2From子句233
7.4.3Where子句235
7.4.4内置对象与方法235
7.5更精彩的查找:Visual VM对OQL的支持240
7.5.1Visual VM的OQL基本语法240
7.5.2内置heap对象241
7.5.3对象函数243
7.5.4集合统计函数247
7.5.5程序化OQL分析Tomcat堆253
7.6小结256
第8章 锁与并发257
8.1安全就是锁存在的理由:锁的基本概念和实现258
8.1.1理解线程安全258
8.1.2对象头和锁260
8.2避免残酷的竞争:锁在Java虚拟机中的实现和优化261
8.2.1偏向锁261
8.2.2轻量级锁263
8.2.3锁膨胀264
8.2.4自旋锁265
8.2.5锁消除265
8.3应对残酷的竞争:锁在应用层的优化思路267
8.3.1减少锁持有时间267
8.3.2减小锁粒度268
8.3.3锁分离270
8.3.4锁粗化272
8.4无招胜有招:无锁274
8.4.1理解CAS274
8.4.2原子操作275
8.4.3新宠儿LongAdder278
8.5将随机变为可控:理解Java内存模型281
8.5.1原子性281
8.5.2有序性283
8.5.3可见性285
8.5.4Happens-Before原则287
8.6小结287
第9章 Class文件结构288
9.1不仅跨平台,还能跨语言:语言无关性288
9.2虚拟机的基石:Class文件290
9.2.1Class文件的标志魔数291
9.2.2Class文件的版本293
9.2.3存放所有常数常量池294
9.2.4Class的访问标记(Access Flag)301
9.2.5当前类、父类和接口302
9.2.6Class文件的字段303
9.2.7Class文件的方法基本结构305
9.2.8方法的执行主体Code属性307
9.2.9记录行号LineNumberTable属性308
9.2.10保存局部变量和参数LocalVariableTable属性309
9.2.11加快字节码校验StackMapTable属性309
9.2.12Code属性总结314
9.2.13抛出异常Exceptions属性315
9.2.14用实例分析Class的方法结构316
9.2.15我来自哪里SourceFile属性319
9.2.16强大的动态调用BootstrapMethods属性320
9.2.17内部类InnerClasses属性321
9.2.18将要废弃的通知Deprecated属性322
9.2.19Class文件总结323
9.3操作字节码:走进ASM323
9.3.1ASM体系结构323
9.3.2ASM之Hello World325
9.4小结326
第10章 Class装载系统327
10.1来
|
內容試閱:
|
关于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~JDK 10,所以特做如下修订:
?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下对本书所做的测试和修订。
读者服务
轻松注册成为博文视点社区用户(www.broadview.com.cn),您即可享受以下服务:
?下载资源:本书如提供示例代码及资源文件,均可在 下载资源 处下载。
?提交勘误:您对书中内容的修改意见可在 提交勘误 处提交,若被采纳,将获赠博文视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。
?与作者交流:在页面下方 读者评论 处留下您的疑问或观点,与作者和其他读者一同学习交流。
页面入口:http:www.broadview.com.cn36774
|
|