具体描述
《Java虚拟机精讲》内容简介:HotSpot VM是目前市面上高性能JVM的代表作之一,它采用解释器+JIT 编译器的混合执行引擎,使得Java 程序的执行性能从此有了质的飞跃。本书以极其精练的语句诠释了 HotSpot VM的方方面面,比如:字节码的编译原理、字节码的内部组成结构、通过源码的方式剖析 HotSpot VM 的启动过程和初始化过程、Java 虚拟机的运行时内存、垃圾收集算法、垃圾收集器(重点讲解了Serial 收集器、ParNew收集器、Parallel收集器、CMS(Concurrent-Mark-Sweep)收集器和 G1(Garbage-First)收集器)、类加载机制,以及HotSpot VM 基于栈的架构模型和执行引擎(解释器的工作流程、JIT 编译器的工作流程、分层编译策略、热点探测功能)等技术。
如果你对JVM 感兴趣,并且从未接触过 JVM,那么本书将会是你探索 JVM 世界的必备入门工具。
本书适用于任何对Java 虚拟机感兴趣的Java 开发人员、系统架构师、Java 虚拟机爱好者。尤其是对于那些从未接触过Java 虚拟机的Java 开发人员,本书笔者竭尽所能用最精练和直接的语句诠释了有关Java 虚拟机的方方面面,只要你熟练掌握了Java 编程基础,那么阅读本书你将不会感觉到任何的吃力和枯燥乏味。
作者简介
曾任平安科技高级架构师,负责高并发即时通讯系统“天下通”的系统架构设计、架构优化、核心功能研发等工作。目前就职于一家互联网创业公司,担任系统架构师,负责企业内部Hadoop大数据平台的推广和实施、系统性能调优、对新员工技术培训等工作,对系统架构设计、大数据、Java虚拟机等技术领域有着浓厚的兴趣和丰富的实战经验。
目录信息
1.1 认识 Java / 1
1.1.1 与生俱来的优点 / 2
1.1.2 语法结构和对象模型 / 4
1.1.3 历史版本追溯 / 5
1.2 Java重要概念 / 7
1.2.1 Java 编程语言 / 7
1.2.2 字节码 / 7
1.2.3 Java API / 8
1.2.4 Java 虚拟机 / 8
1.3 安装与配置 Java 运行环境 / 10
1.3.1 Windows 环境下的安装与 配置 / 10
1.3.2 Linux 环境下的安装与配置 / 11
1.3.3 编写Java 程序 / 12
1.3.4 编译与运行 / 13
1.3.5 关键字与标示符 / 13
1.4 Java技术的新特性 / 14
1.4.1 Java 模块化与 OSGi技术 / 14
1.4.2 语言无关性 / 15
1.4.3 使用Fork/Join 框架实现多核并行 / 16
1.4.4 丰富的语法特性 / 17
1.4.5 过渡到64 位虚拟机 / 18
1.5 实战:玩转 OpenJDK / 19
1.5.1 JDK 与OpenJDK 的关系 / 19
1.5.2 基于OpenJDK 深度定制的 淘宝JVM(TaobaoVM ) / 20
1.5.3 下载OpenJDK 源代码 / 22
1.5.4 构建编译环境 / 22
1.5.5 执行整个 OpenJDK的编译 / 23
1.5.6 执行单独 HotSpot的编译 / 26
1.5.7 导致编译失败的一些疑难 杂症 / 29
1.5.8 使用GDB工具Debug HotSpot. / 30
1.6 本章小结 / 36
第2 章 字节码的编译原理 / 37
2.1 javac 编译器简介 / 37
2.1.1 javac与Eclipse Compiler for Java 编译器 / 38
2.1.2 javac的使用与标准选项配置 / 39
2.1.3 编译原理 / 40
2.1.4 下载javac 编译器源码 / 41
2.1.5 调用compile() 方法执行编译 / 41
2.2 词法解析步骤 / 43
2.2.1 Token 序列 / 45
2.2.2 源码字符集合与 Token 之间 的对应关系 / 47
2.2.3 调用key()方法获取指定Token / 48
2.2.4 调用nextToken() 方法计算Token 的获取规则 / 48
2.2.5 调用parseCompilationUnit() 方法执行词法解 / 49
2.3 语法解析步骤 / 51
2.3.1 调用qualident()方法解析 package 语法节点 / 52
2.3.2 调用importDeclaration()
方法解析import 语法树 / 54
2.3.3 调用classDeclaration() 方法解析class 语法树 / 56
2.4 语义解析步骤 / 59
2.5 生成字节码 / 61
2.6 实战:使用 javap 工具分析字节码 / 62
2.7 实战:使用 GCJ 编译器将Java源码直接编译为本地机器指令 / 64
2.8 本章小结 / 66
第3 章 字节码文件 / 67
3.1 字节码文件的内部组成结构 / 67
3.2 符号引用 / 73
3.2.1 类或者接口的全限定名 / 74
3.2.2 简单名称 / 74
3.2.3 描述符 / 74
3.3 常量池 / 76
3.3.1 CONSTANT_Utf8_info 常量项 / 77
3.3.2 CONSTANT_Integer_info 常量项 / 77
3.3.3 CONSTANT_Float_info 常量项 / 78
3.3.4 CONSTANT_Long_info 常量项 / 78
3.3.5 CONSTANT_Double_info 常量项 / 79
3.3.6 CONSTANT_Class_info 常量项 / 79
3.3.7 CONSTANT_String_info 常量项 / 80
3.3.8 CONSTANT_Fieldref_info 常量项 / 81
3.3.9 CONSTANT_Methodref_info 常量项 / 81
3.3.10 CONSTANT_I nterfaceMethodref _info常量项 / 82
3.3.11 CONSTANT_NameAndType _info常量项 / 82
3.3.12 CONSTANT_MethodHandle _info常量项 / 83
3.3.13 CONSTANT_MethodType _info常量项 / 84
3.3.14 CONSTANT_InvokeDynamic _info常量项 / 84
3.4 字段表 / 85
3.5 方法表 / 86
3.6 属性表 / 88
3.6.1 Code属性 / 89
3.6.2 ConstantValue 属性 / 90
3.6.3 Exceptions 属性 / 91
3.6.4 LineNumberTable 属性 / 92
3.6.5 SourceFile 属性 / 93
3.6.6 LocalVariableTable属性 / 93
3.6.7 InnerClasses属性 / 94
3.6.8 BootstrapMethods 属性 / 95
3.7 本章小结 / 96
第4 章 剖析HotSpot 的Launcher / 97
4.1 HotSpot 的源码目录结构 / 97
4.2 Launcher简介 / 99
4.3 跟踪 Launcher 的执行过程 / 101
4.3.1 使用Launcher 启动JVM / 101
4.3.2 启动函数 main() / 102
4.3.3 在主线程中执行 JavaMain() 函数 / 106
4.3.4 调用JNI_CreateJavaVM() 函数初始化HotSpot / 114
4.3.5 调用LoadClass() 函数获取 Java 启动类 / 115
4.3.6 调用GetStaticMethodId() 函数获取Java 启动方法 / 116
4.3.7 调用CallStaticVoidMethod() 函数执行Java 启动方法 / 116
4.3.8 调用jni_DestroyJavaVM 函数销毁HotSpot / 119
4.4 实战:在 Launcher 中添加 自定义函数模块 / 120
4.5 本章小结 / 121
第5 章 剖析HotSpot 的初始化过程 / 122
5.1 HotSpot 的构成模块 / 122
5.2 Prims 模块 / 124
5.2.1 JNI 子模块 / 124
5.2.2 JVM子模块 / 125
5.2.3 JVMTI 子模块 / 128
5.2.4 Perf 子模块 / 129
5.3 Runtime 模块 / 129
5.3.1 Thread 子模块 / 131
5.3.2 调用create_vm() 函数完成 HotSpot的最终初始化 / 131
5.4 跟踪 HotSpot的初始化过程 / 140
5.4.1 调用init() 和init_2()函数 初始化os 模块 / 141
5.4.2 调用vm_init_globals()函数 初始化全局数据结构 / 144
5.4.3 调用init_globals() 函数 初始化全局模块 / 144
5.5 本章小结 / 146
第6 章 内存分配与垃圾回收 / 147
6.1 JVM的运行时内存区结构 / 147
6.2 线程共享内存区 / 148
6.2.1 Java 堆区 / 148
6.2.2 方法区 / 150
6.2.3 运行时常量池 / 150
6.3 线程私有内存区 / 150
6.3.1 PC寄存器 / 151
6.3.2 Java 栈 / 151
6.3.3 本地方法栈 / 152
6.4 性能监控区 / 152
6.5 自动内存管理 / 152
6.5.1 内存分配原理 / 153
6.5.2 逃逸分析与栈上分配 / 157
6.5.3 对象内存布局与 OOP-Klass 模型 / 158
6.5.4 GC 的作用 / 159
6.5.5 垃圾标记:根搜索算法 / 160
6.5.6 垃圾回收:分代收集算法 / 161
6.6 垃圾收集器 / 164
6.6.1 串行回收:Serial 收集器 / 165
6.6.2 并行回收:ParNew收集器 / 166
6.6.3 程序吞吐量优先:Parallel 收集器 / 166
6.6.4 低延迟:CMS(Concurrent- Mark-Sweep)收集器 / 167
6.6.5 区域化分代式:G1(Garbage- First )收集器 / 170
6.6.6 垃圾收集的相关选项配置 / 172
6.7 实战:GC日志分析 / 175
6.7.1 不同GC日志的展示形式 / 175
6.7.2 使用GCHisto 工具分析离线 日志 / 179
6.8 实战:分析 dump 文件 / 181
6.8.1 使用jmap 工具生成dump 文件 / 181
6.8.2 使用MAT(Memory Analyzer Tool )工具分析 dump 文件 / 182
6.9 本章小结 / 184
第7 章 类加载机制 / 185
7.1 类加载器 / 185
7.1.1 抽象类ClassLoader / 187
7.1.2 双亲委派模型 / 188
7.1.3 自定义类加载器 / 191
7.1.4 定位ClassNotFoundException 异常 / 193
7.1.5 定位NoClassDefFoundError 异常 / 194
7.2 类的加载过程 / 195
7.2.1 加载字节码 / 198
7.2.2 验证阶段 / 199
7.2.3 准备阶段 / 200
7.2.4 解析阶段 / 201
7.2.5 初始化阶段 / 201
7.3 实战:字节码文件的加密与 解密 / 204
7.4 本章小结 / 208
第8 章 剖析HotSpot 的架构模型与 执行引擎 / 209
8.1 栈帧的组成结构 / 209
8.1.1 局部变量表 / 211
8.1.2 操作数栈 / 212
8.1.3 动态链接 / 214
8.1.4 方法返回值 / 216
8.2 HotSpot 中执行引擎的架构 模型 / 216
8.2.1 本地机器指令 / 217
8.2.2 寄存器架构与栈式架构之间 的区别 / 218
8.2.3 基于栈式架构的设计 / 221
8.2.4 调用call_stub()函数执行Java 方法 / 222
8.2.5 栈顶缓存(Top-of-Stack Cashing ) 技术 / 225
8.2.6 实战:跟踪字节码解释器的 执行步骤 / 227
8.3 解释器与 JIT 编译器 / 230
8.3.1 查阅HotSpot的运行时执 行模式 / 231
8.3.2 解释器的工作机制与构成模块 / 232
8.3.3 JIT 编译器的工作机制与构成模块 / 234
8.3.4 分层编译策略 / 235
8.3.5 热点探测功能 / 236
8.4 本章小结 / 239
附录A Java7新增语法特性 / 241
A.1 try-with-resources 语句 / 241
A.2 泛型的“<>”类型推断运算符 / 245
A.3 声明二进制字面值 / 247
A.4 字面值下画线支持 / 248
A.5 switch表达式支持 String 类型 / 250
A.6 mutil-catch特性 / 251
A.7 NIO2.0 文件系统的改变 / 255
附录B 指令助记符 / 262
· · · · · · (收起)
读后感
感谢各位读者的支持和帮助,如果有问题,请反馈给我,谢谢。 本人邮箱:gao_xianglong@sina.com 本人博客地址:http://gao-xianglong.iteye.com/。
刚开始看,尽管看的不是很懂,但是,总体来说,文字看起来不会那么累,简单轻松的就描绘了一个技术细节,对于JVM原理性入门确实是一本值得推荐的好作品。。。。。。。。。。。。。。。 书章节没有太多,但是总体看完基本上算上道了。
此书语言精练,连贯性强,深入的的恰到好处,看起来不会觉得枯燥难懂。干货比较多,不像其他书一样开头几十页没用的。字节码这章顺着作者的思路,即使不了解编译原理也能够轻松理解,总体上来说原理性的讲解较多,实战和实例较少,尤其是内存回收这块。非常适合作为虚拟机的入...
刚开始看,尽管看的不是很懂,但是,总体来说,文字看起来不会那么累,简单轻松的就描绘了一个技术细节,对于JVM原理性入门确实是一本值得推荐的好作品。。。。。。。。。。。。。。。 书章节没有太多,但是总体看完基本上算上道了。
感谢各位读者的支持和帮助,如果有问题,请反馈给我,谢谢。 本人邮箱:gao_xianglong@sina.com 本人博客地址:http://gao-xianglong.iteye.com/。
用户评价
这本号称深入剖析JVM的书籍,着实让我这位浸淫Java多年、自诩对底层原理已有相当理解的老码农捏了一把汗。初次翻阅,我本以为能看到那些教科书式的、枯燥的字节码分析和内存模型理论的重新演绎,但出乎意料的是,它给我的感觉更像是一次对现代JVM设计哲学和工程实践的深度“考古”。作者并没有沉溺于追溯早期HotSpot的黑历史,而是将重点放在了JIT编译器的优化策略上,比如逃逸分析、内联机制的演进,以及新的垃圾收集器ZGC、Shenandoah在实际生产环境中的性能权衡与调优思路。尤其是关于并发编程模型下,JVM如何通过内存屏障和CAS操作来保证数据一致性的章节,讲解得尤为细致,甚至引入了最新的OpenJDK源码片段进行对照说明,这对于那些日常开发中频繁与多线程打交道,却对底层屏障机制一知半解的工程师来说,无疑是醍醐灌顶。书中对GC日志的解读部分,不再是简单地罗列参数,而是通过几个经典的线上故障案例复盘,展示了如何从错综复杂的日志中,快速定位到是年轻代晋升压力过大,还是老年代的并发G1回收停顿时间超标,这种实战导向的叙述方式,极大地提升了阅读的代入感和实用价值。
我花费了很长时间去寻找一本能够真正解释清楚JVM内部运行时数据区各个内存区域如何协同工作的书籍,很多资料要么只停留在理论层面,要么就是针对特定版本的JDK进行描述,时效性不佳。而这本《Java虚拟机精讲》,在讲解方法区(Metaspace)的动态伸缩、内存溢出排查时,提供了一套系统性的分析流程。它没有回避JIT编译器在编译过程中的“即时”特性,而是深入探讨了Tiered Compilation(分层编译)策略,解释了C1和C2编译器各自的侧重点,以及Profile数据是如何驱动代码的激进优化的。更让我感到惊喜的是,书中对动态编译器(JIT Compiler)的入口和出口点进行了剖析,展示了Profiled Deoptimization(去优化)的复杂机制,这解释了为什么有时程序在热启动后反而会出现性能短暂下降的原因。这种对性能调优中那些微妙的、难以察觉的内在工作原理的细致描摹,使得这本书的参考价值远超一般的设计模式或框架指南,它真正触及了Java程序执行效率的根基。
这本书的风格非常硬核,它不像某些畅销书那样追求华丽的辞藻和简化的比喻,而是直截了当地把复杂的工程实现摆在你面前,要求读者带着批判性思维去吸收。我尤其欣赏它对GraalVM的介绍,这部分内容非常前沿且实用。它不仅介绍了GraalVM作为下一代高性能运行时和提前编译(AOT)解决方案的潜力,还详细分析了如何利用Substrate VM进行原生镜像的构建,以及在这个过程中,JVM运行时特性(如反射、动态代理)需要如何调整以适应AOT环境的限制。这种面向未来的技术前瞻性,让这本书不仅仅停留在对经典HotSpot的总结上,而是为读者指明了Java生态接下来的发展方向。对于那些希望在技术栈上保持领先地位的开发者而言,这本书提供的关于AOT编译的实践指南和原理剖析,是其价值的有力佐证,它让你明白,JVM的演进从未停止,而这本书正是站在了当前技术浪潮的最前沿。
说实话,我对技术书籍的期望值一向较高,尤其是涉及“精讲”二字的,总担心内容会流于表面,无法深入骨髓。然而,这本《Java虚拟机精讲》在处理内存管理和数据布局时,展现出的深度和广度,远超我的预期。它没有回避Java对象头(Mark Word)中那些与CPU缓存行对齐、伪共享(False Sharing)相关的高级议题,甚至详细阐述了JVM如何通过字段排序、填充字节来优化对象在内存中的访问局部性,以最大化利用CPU缓存的L1/L2/L3。这对于处理高并发、低延迟业务的系统架构师来说,是至关重要的知识。更令人称道的是,书中对JVM内存模型(JMM)的解读,并非孤立地讲解Happens-Before原则,而是将其与volatile、synchronized关键字的底层实现(比如锁升级、偏向锁的撤销)串联起来,构建了一个完整的并发心智模型。读完这部分,我立刻回去检查了我负责的几个高性能模块的内存读写逻辑,发现了一些因误解JMM导致的潜在竞态风险,这本书的价值,在此刻得到了最直观的体现。
我不得不说,这本书的架构设计,简直是为那些渴望从“会用Java”跨越到“精通Java平台”的开发者量身定制的。它避开了太多初学者都会接触到的JVM基础概念的泛泛而谈,直接切入了JVM作为一门“运行时”技术的核心——性能剖析与定制化。我特别欣赏作者在描述类加载机制时,引入了模块化(JPMS)时代对双亲委派模型的冲击与重构,这在很多老旧的JVM书籍中是完全缺失的视野。同时,对于类文件结构的解析,它不仅仅停留在Class文件格式规范的复述,而是结合了ASM、Javassist等字节码操作工具,教读者如何动态地修改和生成字节码,这部分内容对于做AOP框架开发或者需要进行字节码插桩的场景,简直就是一份宝藏操作手册。阅读过程中,我常常需要停下来,打开自己的IDE,跟着书中的示例代码,自己动手编译、运行,观察其在不同JVM参数下的行为差异,这种理论与实践紧密结合的阅读体验,远比单纯的理论灌输要来得深刻和持久,它真正做到了将JVM从一个“黑箱”逐渐拆解成一个个清晰可控的“白箱组件”。
书还没有出吧,还没买,到时候买了再评论。
为了定位解决线上的fullGC问题,阅读了GC部分。确实有帮助,讲的比较清晰。
书还没有出吧,还没买,到时候买了再评论。
结合HotSpot来谈JVM还不错
不错 这本书 正在读 写得很详细且易懂 适合从事java的人员读