具体描述
《HotSpot实战》深入浅出地讲解了HotSpot虚拟机的工作原理,将隐藏在它内部的本质内容逐一呈现在读者面前,包括OpenJDK与HotSpot项目、编译和调试HotSpot的方法、HotSpot内核结构、Launcher、OOP-Klass对象表示系统、链接、运行时数据区、方法区、常量池和常量池Cache、Perf Data、Crash分析方法、转储分析方法、垃圾收集器的设计演进、CMS和G1收集器、栈、JVM对硬件寄存器的利用、栈顶缓存技术、解释器、字节码表、转发表、Stubs、Code Cache、Code生成器、JIT编译器、C1编译器、编译原理、JVM指令集实现、函数的分发机制、VTABLE和ITABLE、异常表、虚拟机监控工具(如jinfo、jstack、jhat、jmap等)的实现原理和开发方法、Attach机制、基于GUI的JVM分析工具(如MAT、VisualVM)等内容。
除了HotSpot技术,《HotSpot实战》还对方法论进行了探讨。在各个章节的讲解中,都会有一些与系统运行机制相关的实战或练习,供读者练手。通过这些实战练习,不仅有助于读者加深对知识或原理的理解,更为重要的是,它还可以培养读者独立探索的思维方式,这有助于读者把知识融会贯通并灵活应用到实际项目中。
《HotSpot实战》适合于已具有一定Java编程基础的读者,以及在Java或基于JVM的编程语言平台下进行各类软件开发的开发人员、测试人员和运维人员。对于JVM和编程语言爱好者来说,《HotSpot实战》也具有一定的学习参考价值。
作者简介
陈涛,硕士,毕业于中国科技大学。现就职于网易公司旗下的网易宝,从事在线支付系统的设计与开发工作。在从事Java工作之前 ,曾有过Linux内核及驱动开发工作经验。热衷于专研技术,对编程语言和JVM比较感兴趣。工作之余 ,喜欢足球和武侠带来的乐趣。目前正在“专研”的课题是如何做一名称职的奶爸。
目录信息
1.1 JDK概述 2
1.1.1 JCP与JSR 3
1.1.2 JDK的发展历程 4
1.1.3 Java 7的语法变化 7
1.2 动手编译虚拟机 13
1.2.1 源代码下载 13
1.2.2 HotSpot源代码结构 13
1.2.3 搭建编译环境 15
1.2.4 编译目标 16
1.2.5 编译过程 17
1.2.6 编译常见问题 19
1.3 实战:在HotSpot内调试HelloWorld 20
1.3.1 认识GDB 21
1.3.2 准备调试脚本 22
1.4 小结 26
第2章 启动 28
2.1 HotSpot内核 28
2.1.1 如何阅读源代码 28
2.1.2 HotSpot内核框架 36
2.1.3 Prims 37
2.1.4 Services 39
2.1.5 Runtime 43
2.2 启动 46
2.2.1 Launcher 46
2.2.2 虚拟机生命周期 48
2.2.3 入口:main函数 50
2.2.4 主线程 51
2.2.5 InitializeJVM函数 53
2.2.6 JNI_CreateJavaVM函数 55
2.2.7 调用Java主方法 56
2.2.8 JVM退出路径 56
2.3 系统初始化 57
2.3.1 配置OS模块 58
2.3.2 配置系统属性 60
2.3.3 加载系统库 61
2.3.4 启动线程 62
2.3.5 vm_init_globals函数:初始化全局数据结构 65
2.3.6 init_globals函数:初始化全局模块 65
2.4 小结 69
第3章 类与对象 70
3.1 对象表示机制 71
3.1.1 OOP-Klass二分模型 71
3.1.2 Oops模块 71
3.1.3 OOP框架与对象访问机制 73
3.1.4 Klass与instanceKlass 79
3.1.5 实战:用HSDB调试HotSpot 82
3.2 类的状态转换 87
3.2.1 入口:Class文件 87
3.2.2 类的状态 92
3.2.3 加载 96
3.2.4 链接 101
3.2.5 初始化 104
3.2.6 实战:类的“族谱” 107
3.2.7 实战:系统字典 111
3.3 创建对象 113
3.3.1 实例对象的创建流程 114
3.3.2 实战:探测JVM内部对象 116
3.4 小结 119
第4章 运行时数据区 120
4.1 堆 121
4.1.1 Java的自动内存管理 121
4.1.2 堆的管理 122
4.2 线程私有区域 125
4.2.1 PC 125
4.2.2 JVM栈 126
4.3 方法区 126
4.3.1 纽带作用 127
4.3.2 常量池 130
4.3.3 常量池缓存:ConstantPoolCache 133
4.3.4 方法的表示:methodOop 134
4.3.5 方法的解析:将符号引用转换成直接引用 138
4.3.6 代码放在哪里:ConstMethodOop 141
4.3.7 实战:探测运行时常量池 142
4.4 性能监控数据区:Perf Data 147
4.4.1 描述这段空间:PerfMemory 147
4.4.2 查看 148
4.4.3 生产 150
4.5 转储 151
4.5.1 用VisualVM进行转储分析 151
4.5.2 JVM Crash 153
4.6 小结 158
第5章 垃圾收集 159
5.1 堆与GC 160
5.1.1 垃圾收集 160
5.1.2 分代收集 162
5.1.3 快速分配 165
5.1.4 栈上分配和逸出分析 167
5.1.5 GC公共模块 167
5.2 垃圾收集器 170
5.2.1 设计演进 170
5.2.2 CMS收集器 175
5.2.3 G1收集器 180
5.3 实战:性能分析方法 184
5.3.1 获取GC日志 184
5.3.2 GC监控信息 187
5.3.3 内存分析工具 189
5.3.4 选择合适的收集器与GC性能评估 190
5.3.5 不要忽略JVM Crash日志 195
5.4 小结 196
第6章 栈 197
6.1 硬件背景:了解真实机器 198
6.1.1 程序是如何运行的 198
6.1.2 x86与栈帧 199
6.1.3 ARM对Java硬件级加速:Jazelle技术 202
6.2 Java栈 203
6.2.1 寄存器式指令集与栈式指令集 203
6.2.2 HotSpot中的栈 204
6.2.3 栈帧 207
6.2.4 充分利用寄存器资源 210
6.2.5 虚拟机如何调用Java函数 212
6.2.6 优化:栈顶缓存 221
6.2.7 实战:操作数栈 223
6.3 小结 228
第7章 解释器和即时编译器 229
7.1 概述 230
7.2 解释器如何工作 231
7.2.1 Interpreter模块 232
7.2.2 Code模块 234
7.2.3 字节码表 235
7.2.4 Code Cache 236
7.2.5 InterpreterCodelet与Stub队列 239
7.2.6 Code生成器 241
7.2.7 模板表与转发表 244
7.2.8 实战:InterpreterCodelet 247
7.3 即时编译器 250
7.3.1 概述 250
7.3.2 编译器模块 251
7.3.3 编译器的基本结构 252
7.3.4 实战:编译原理实践,了解编译中间环节 255
7.4 小结 267
第8章 指令集 268
8.1 再说栈式指令集 268
8.2 数据传送 270
8.2.1 局部变量、常量池和操作数栈之间的数据传送 270
8.2.2 数据传送指令 272
8.2.3 实战:数组的越界检查 277
8.3 类型转换 279
8.4 对象的创建和操作 281
8.5 程序流程控制 282
8.5.1 控制转移指令 282
8.5.2 条件转移 283
8.5.3 无条件转移 284
8.5.4 复合条件转移 285
8.5.5 实战:switch语句如何使用String 287
8.6 运算 290
8.6.1 加法:iadd 290
8.6.2 取负:ineg 291
8.7 函数的调用和返回 292
8.7.1 Java函数分发机制:VTABLE与ITABLE 293
8.7.2 invoke系列指令 297
8.7.3 动态分发:覆盖 299
8.7.4 静态分发:重载 302
8.8 异常 305
8.8.1 异常表 305
8.8.2 创建异常 306
8.8.3 try-catch 309
8.8.4 finally 311
8.9 小结 312
第9章 虚拟机监控工具 313
9.1 Attach机制 314
9.1.1 AttachProvider与VirtualMachine 314
9.1.2 命令的下发:execute() 317
9.1.3 命令的执行:Attach Listener守护线程 319
9.2 查看JVM进程 320
9.2.1 用jps查看Java进程 320
9.2.2 实战:定制jps,允许查看库路径 323
9.3 查看和配置JVM 326
9.3.1 用jinfo查看JVM参数配置 326
9.3.2 实战:扩展flags选项,允许查看命令行参数 330
9.4 堆内存转储工具 332
9.4.1 Heap Dump 332
9.4.2 原理 333
9.5 堆转储分析 337
9.5.1 Heap Dump分析工具:jhat 337
9.5.2 实战:MAT分析过程 340
9.6 线程转储分析 343
9.6.1 jstack 343
9.6.2 实战:如何分析资源等待 344
9.7 小结 347
· · · · · · (收起)
读后感
具体实现方面没讲,大部分都是源码的导航,而且练习题对入门有点坑。但是关键的地方例如对象内存结构还是有具体讲解对汇编调试还是有很大的帮助。想要深入了解运行时的话单看这本书理解不了,还是得阅读网上的一些源码文章并自己动手调试。总的来说可以搭配周志明老师的深入理...
这本书比较适合有C/C++经验的开发人员阅读,如果你不懂,那么阅读这本书的时候,个人感觉几乎对你没有太多的帮助,源码的东西。这本书并非教你在实战中如何调优,纯粹就是对源码进行讲解,所以抱实战的目的去看待这本书,你或许会失望。纯属泛泛而谈的知识点。
这本书比较适合有C/C++经验的开发人员阅读,如果你不懂,那么阅读这本书的时候,个人感觉几乎对你没有太多的帮助,源码的东西。这本书并非教你在实战中如何调优,纯粹就是对源码进行讲解,所以抱实战的目的去看待这本书,你或许会失望。纯属泛泛而谈的知识点。
这本书比较适合有C/C++经验的开发人员阅读,如果你不懂,那么阅读这本书的时候,个人感觉几乎对你没有太多的帮助,源码的东西。这本书并非教你在实战中如何调优,纯粹就是对源码进行讲解,所以抱实战的目的去看待这本书,你或许会失望。纯属泛泛而谈的知识点。
具体实现方面没讲,大部分都是源码的导航,而且练习题对入门有点坑。但是关键的地方例如对象内存结构还是有具体讲解对汇编调试还是有很大的帮助。想要深入了解运行时的话单看这本书理解不了,还是得阅读网上的一些源码文章并自己动手调试。总的来说可以搭配周志明老师的深入理...
用户评价
我是一个偏向于运维和SRE背景的读者,通常更关注监控和告警体系的构建。《HotSpot实战》这本书在我看来,最大的亮点之一就是它对“可观测性”的深度挖掘和实战指导。它没有仅仅停留在Prometheus或Grafana的表面配置上,而是教会我们如何从JVM、操作系统甚至应用层去主动“探查”系统的健康状态。比如,书中详细介绍了几种高级的Profiling技术,如何使用火焰图(Flame Graphs)来精准定位CPU热点,这比单纯看线程Dump要高效得多。我按照书中的指引,成功地将我们线上一个服务中异常频繁的耗时操作可视化,一眼就看出了是哪个方法链条拖慢了整个请求。此外,书中关于日志和追踪系统的集成也有独到的见解,它强调了上下文传递的重要性,确保在分布式调用中,我们能完整地还原一次请求的生命周期。这对于故障排查的效率提升是革命性的。这本书的知识体系非常全面,它把开发、测试和运维环节的性能优化需求都考虑进去了,构建了一个完整的性能闭环管理思路,而不是把性能问题扔给开发团队就算完事了。
这本书简直是为那些深受系统“假死”和“卡顿”困扰的开发人员量身打造的秘籍。《HotSpot实战》的笔触非常细腻,尤其在分析操作系统层面对Java应用的影响时,看得出来作者下了极大的功夫去研究内核调度和上下文切换的成本。我曾经遇到过一个诡异的场景,CPU使用率不高,但系统响应奇慢,找不出任何明显的资源争抢点,最后不了了之。《HotSpot实战》里关于调度器偏置和内存屏障对并发性能影响的分析,让我茅塞顿开,原来是底层硬件的一些微小差异在作怪。书中关于内存模型和并发工具类的源码解析部分,简直是神来之笔。它不是简单地把`java.util.concurrent`包里的类复制过来,而是深入到`Unsafe`类和CAS操作的底层逻辑,用最直观的方式解释了为什么`Volatile`能保证可见性,以及`Lock`和`Synchronized`在不同场景下的性能权衡。通过阅读这些章节,我感觉自己对Java并发编程的理解一下子提升了一个档次,不再是那种“能用就行”的状态,而是真正理解了背后的机制。对于任何想从“CRUD Boy”蜕变成“性能架构师”的人来说,这本书都是不可或缺的垫脚石。
这本《HotSpot实战》真是让人大开眼界,尤其是在处理那些数据库性能瓶颈时,简直是为我量身打造的救星。我之前一直苦于那些时不时冒出来的慢查询,每次优化都像是在黑暗中摸索,效果时好时坏。《HotSpot实战》这本书没有那种空泛的理论说教,而是直接把那些高并发场景下的热点数据分析和优化策略摆在了桌面上。我记得有几个章节专门讲了如何利用JVM的工具集去定位那些隐藏极深的GC问题,简直是把我平时处理起来束手无策的内存抖动问题,掰开了揉碎了讲清楚。读完后,我立刻上手实操,按照书里的步骤一步步来,很快就找到了我们系统中一个经常因为缓存失效导致数据库负载骤增的“元凶”。那种茅塞顿开的感觉,不亚于找到了失散多年的宝藏。这本书的案例非常贴近实际工作,比如针对高频写入和读取的场景下,如何设计合理的锁粒度和缓存过期策略,书里都有非常详细的对比和优劣分析。特别是关于分布式事务处理的章节,它没有停留在理论层面,而是直接给出了基于Redis或ZooKeeper实现两阶段提交或TCC的实战代码片段和注意事项,这对于我们这种需要高可用性的系统来说,价值无可估量。总的来说,这本书的实战性极强,不是那种纸上谈兵的教科书,而是真正能拿来救火的“工具箱”。
这本书的语言风格和知识的组织方式,给我一种非常“现代”和“前沿”的感觉。它没有沉溺于过时的技术栈,而是聚焦于当前业界最热门、挑战性最大的领域。我尤其对其中关于图计算和大数据处理中内存布局优化的章节印象深刻。《HotSpot实战》探讨了如何优化JVM堆外内存的使用,以及如何与现代的Off-Heap存储技术(如MapDB或者直接使用ByteBuffer)结合,来处理TB级别的数据集。这对于我们正在进行的数据中台改造项目来说,提供了非常宝贵的参考。作者在讨论这些复杂话题时,总能巧妙地将理论与具体的硬件特性(比如CPU缓存行对齐)联系起来,使得性能优化的指导不再是玄学,而是基于物理规律的工程实践。另一个让我赞叹的地方是,书中对安全性和性能的平衡处理。它提供了一些代码混淆和加固的策略,同时评估了这些安全措施对运行时性能的影响,这种全面的视角体现了作者深厚的工程素养。总而言之,《HotSpot实战》是一本能够帮助技术人员保持领先地位的指南,它不仅解决了眼前的性能问题,更培养了我们预见未来技术挑战的能力。
说实话,刚拿到《HotSpot实战》的时候,我还有点担心,生怕又是那种故作高深的IT书籍,充满了晦涩难懂的术语和走不通的demo。但翻开目录后,我的疑虑就消散了。这本书的叙事方式非常“接地气”,它就像一个经验丰富的老兵在带新兵蛋子一样,循循善诱,把复杂的概念拆解成一个个可以理解的小模块。我特别欣赏它在网络I/O模型上的阐述,特别是NIO和AIO的对比,作者用非常形象的比喻解释了阻塞和非阻塞的区别,让我这个之前对异步编程有点畏惧的人,也敢于去尝试更高效的网络处理方案了。更让我惊喜的是,书中有一部分内容聚焦于如何对微服务架构中的服务间通信进行性能调优。我们团队最近正好在做服务拆分,但是发现服务调用链变长后,延迟反而增加了不少。《HotSpot实战》提供的那些关于RPC框架(比如Dubbo或者gRPC)的底层原理和参数调优建议,简直是雪中送炭。我按照书里说的调整了线程池配置和序列化方式,虽然只是一个小小的改动,但整体延迟确实下降了近20%,这在我们的核心业务流程中已经是非常显著的提升了。这本书的价值在于,它不仅告诉你“做什么”,更重要的是告诉你“为什么这么做”,这种深层次的理解,才是构建健壮系统的基石。
点到即止,没有展开,不够系统,不过还是值得一看
对于理解JVM中底层实现有一定帮助,不过当时有些核心问题还是没有找到答案。建议配合《深入理解JVM虚拟机》一起看
买的最糟糕的一本书。
买的最糟糕的一本书。
此书的准确定位是Hotspot源码阅读导览