《Java性能优化实践(JVM调优策略/工具与技巧)》是由人民邮电出版社出版的一本关于Java优化方面的书籍,作者是本杰明·J.、埃文斯,主要介绍了关于Java性能优化、JVM调优策略、JVM工具与技巧方面的知识内容,目前在Java优化类书籍综合评分为:9.9分。
书籍介绍
编辑推荐
在当前的互联网开发模式下,系统访问量日增、代码臃肿,各种性能问题纷涌而至。性能优化作为一个常谈常新的话题,受到越来越多开发者的关注。而Java是一门使用广泛的语言,社区生态中积攒了大量宝贵的性能优化经验。
1.作为一本性能调优方面的实用指南,本书从实验科学的角度将JVM调优的技术原理与方法论相结合,并在此基础上提供了可选择的工具。
2.通过对各方面的深入研究,本书能让使用复杂技术栈的中高级Java技术专家以量化和可验证的方法优化Java应用程序性能。
了解Java的原则和技术如何充分利用现代硬件和操作系统
探究一些性能测试以及困扰团队的常见反模式
理解测量Java性能数据的陷阱以及微基准测试的缺点
深入研究JVM垃圾收集日志、监控、调优和工具
探究JIT编译和Java语言性能技术
学习Java集合类API与性能有关的方面,从整体上理解Java并发
内容简介
本书从实验科学的角度探讨了Java性能优化的方方面面,重点阐述了*的实用JVM性能调优策略、工具和技巧。通过本书,我们不仅可以了解Java原理和技术如何充分利用现代硬件和操作系统、衡量Java性能的陷阱以及微基准测试的弊端有哪些,还能深入研究可能使团队烦恼的几种性能测试和常见反模式、JVM垃圾收集、JIT编译和Java语言性能技术等。本书为读者打开了深入理解Java性能的大门,并以路标助力其优化之旅。
目录
- 中文版推荐序一 xv
- 中文版推荐序二 xvi
- 序 xvii
- 前言 xix
- 第 1 章 明确优化与性能 1
- 1.1 关于Java性能的误解 1
- 1.2 Java性能概览 2
- 1.3 作为实验科学的性能 3
- 1.4 性能分类方法 4
- 1.4.1 吞吐量 4
- 1.4.2 延迟 5
- 1.4.3 容量 5
- 1.4.4 利用率 5
- 1.4.5 效率 5
- 1.4.6 可扩展性 5
- 1.4.7 降级 6
- 1.4.8 各种性能观测之间的关联 6
- 1.5 阅读性能图 7
- 1.6 小结 11
- 第 2 章 JVM概览 12
- 2.1 解释和类加载 12
- 2.2 执行字节码 13
- 2.3 HotSpot简介 17
- 2.4 JVM内存管理 19
- 2.5 线程和Java内存模型 20
- 2.6 认识不同的JVM 20
- 2.7 JVM的监控和工具 22
- 2.8 小结 25
- 第 3 章 硬件与操作系统 26
- 3.1 现代硬件简介 27
- 3.2 内存 27
- 3.3 现代处理器特性 33
- 3.3.1 翻译后备缓冲器 33
- 3.3.2 分支预测和推测执行 33
- 3.3.3 硬件存储器模型 33
- 3.4 操作系统 34
- 3.4.1 调度器 35
- 3.4.2 时间问题 36
- 3.4.3 上下文切换 37
- 3.5 一个简单的系统模型 38
- 3.6 基本探测策略 39
- 3.6.1 利用CPU 40
- 3.6.2 垃圾收集 41
- 3.6.3 I/O 42
- 3.6.4 机械共鸣 43
- 3.7 虚拟化 44
- 3.8 JVM和操作系统 45
- 3.9 小结 46
- 第 4 章 性能测试模式与反模式 47
- 4.1 性能测试的类型 47
- 4.1.1 延迟测试 48
- 4.1.2 吞吐量测试 48
- 4.1.3 负载测试 49
- 4.1.4 压力测试 49
- 4.1.5 耐久性测试 49
- 4.1.6 容量规划测试 49
- 4.1.7 退化测试 50
- 4.2 最佳实践入门 50
- 4.2.1 自上而下的性能测试 50
- 4.2.2 创建一个测试环境 51
- 4.2.3 确定性能要求 52
- 4.2.4 Java特有的问题 52
- 4.2.5 将性能测试当作软件开发生命周期的一部分 52
- 4.3 性能反模式 53
- 4.3.1 厌倦 53
- 4.3.2 填充简历 54
- 4.3.3 同侪压力 54
- 4.3.4 缺乏理解 54
- 4.3.5 被错误理解的问题/不存在的问题 54
- 4.4 性能反模式目录 55
- 4.4.1 被热门技术分心 55
- 4.4.2 被简单分心 55
- 4.4.3 性能调优天才 56
- 4.4.4 按照坊间传说调优 57
- 4.4.5 把责任归咎给驴 58
- 4.4.6 忽略大局 59
- 4.4.7 用户验收测试环境就是我的计算机 60
- 4.4.8 类似生产环境的数据很难表示 61
- 4.5 认知偏差与性能测试 62
- 4.5.1 还原论思维 62
- 4.5.2 确认偏差 63
- 4.5.3 战争的迷雾(行动偏差) 63
- 4.5.4 风险偏差 64
- 4.5.5 埃尔斯伯格悖论 64
- 4.6 小结 65
- 第 5 章 微基准测试与统计 66
- 5.1 Java性能测量 66
- 5.2 JMH 70
- 5.2.1 不是万不得已,不要做微基准测试(一个真实的故事) 70
- 5.2.2 关于何时使用微基准测试的启发 70
- 5.2.3 JMH框架 72
- 5.2.4 执行基准测试 73
- 5.3 JVM性能统计 77
- 5.3.1 误差类型 78
- 5.3.2 非正态统计 82
- 5.4 统计的解释 85
- 5.5 小结 88
- 第 6 章 理解垃圾收集 89
- 6.1 标记和清除 90
- 6.2 HotSpot运行时 92
- 6.2.1 对象的运行时表示 92
- 6.2.2 GC根和Arena 95
- 6.3 分配与生命周期 96
- 6.4 HotSpot中的垃圾收集 98
- 6.4.1 线程本地分配 98
- 6.4.2 半空间收集 99
- 6.5 并行收集器 100
- 6.5.1 新生代并行收集 101
- 6.5.2 老年代并行收集 102
- 6.5.3 并行收集器的局限性 103
- 6.6 分配的作用 104
- 6.7 小结 108
- 第 7 章 垃圾收集高级话题 109
- 7.1 权衡与可插拔的收集器 109
- 7.2 并发垃圾收集理论 111
- 7.2.1 JVM安全点 111
- 7.2.2 三色标记 112
- 7.3 CMS 114
- 7.3.1 CMS是如何工作的 115
- 7.3.2 用于CMS的基本JVM标志 117
- 7.4 G1 118
- 7.4.1 G1堆布局和区域 118
- 7.4.2 G1算法设计 119
- 7.4.3 G1的各阶段 120
- 7.4.4 用于G1的基本JVM标志 121
- 7.5 Shenandoah 121
- 7.5.1 并发压缩 123
- 7.5.2 获取Shenandoah 123
- 7.6 C4(Azul Zing) 124
- 7.7 IBM J9中的均衡收集器 127
- 7.7.1 J9对象头 128
- 7.7.2 Balanced收集器的大数组 129
- 7.7.3 NUMA和Balanced收集器 129
- 7.8 遗留的HotSpot收集器 130
- 7.8.1 Serial和SerialOld 130
- 7.8.2 增量式CMS 131
- 7.8.3 已被废弃和删除的垃圾收集组合 131
- 7.8.4 Epsilon 131
- 7.9 小结 132
- 第 8 章 垃圾收集日志、监控、调优及工具 133
- 8.1 认识垃圾收集日志 133
- 8.1.1 开启垃圾收集日志记录 133
- 8.1.2 垃圾收集日志与JMX的对比 134
- 8.1.3 JMX的缺点 135
- 8.1.4 垃圾收集日志数据带来的好处 136
- 8.2 日志解析工具 136
- 8.2.1 Censum 137
- 8.2.2 GCViewer 139
- 8.2.3 对于同一数据的不同可视化效果 140
- 8.3 基本垃圾收集调优 141
- 8.3.1 理解分配行为 142
- 8.3.2 理解暂停时间 144
- 8.3.3 收集器线程和GC根 145
- 8.4 调优Parallel GC 147
- 8.5 调优CMS 148
- 8.6 调优G1 150
- 8.7 jHiccup 152
- 8.8 小结 154
- 第 9 章 JVM上的代码执行 155
- 9.1 字节码解释概览 155
- 9.1.1 JVM字节码 158
- 9.1.2 简单解释器 163
- 9.1.3 HotSpot特定细节 165
- 9.2 AOT编译和JIT编译 166
- 9.2.1 AOT编译 166
- 9.2.2 JIT编译 167
- 9.2.3 比较AOT和JIT 168
- 9.3 HotSpot JIT基础 168
- 9.3.1 Klass字、虚函数表和指针变换 168
- 9.3.2 JIT编译日志 169
- 9.3.3 HotSpot中的编译器 171
- 9.3.4 HotSpot中的分层编译 171
- 9.4 代码缓存 172
- 9.5 简单JIT调优 173
- 9.6 小结 174
- 第 10 章 理解即时编译 175
- 10.1 认识JITWatch 175
- 10.1.1 基本的JITWatch视图 176
- 10.1.2 调试JVM和hsdi 180
- 10.2 介绍JIT编译 180
- 10.3 内联 181
- 10.3.1 内联的限制 182
- 10.3.2 调优内联子系统 183
- 10.4 循环展开 184
- 10.5 逃逸分析 186
- 10.5.1 消除堆分配 187
- 10.5.2 锁与逃逸分析 188
- 10.5.3 逃逸分析的限制 189
- 10.6 单态分派 192
- 10.7 内部函数 195
- 10.8 栈上替换 197
- 10.9 再谈安全点 199
- 10.10 核心库方法 199
- 10.10.1 内联方法的大小上限 199
- 10.10.2 编译方法的大小上限 203
- 10.11 小结 204
- 第 11 章 Java语言性能技术 205
- 11.1 优化集合 206
- 11.2 针对列表的优化考虑 207
- 11.2.1 ArrayList 207
- 11.2.2 LinkedList 208
- 11.2.3 ArrayList与LinkedList的对比 209
- 11.3 针对映射的优化考虑 210
- 11.3.1 HashMap 210
- 11.3.2 TreeMap 212
- 11.3.3 缺少MultiMap 213
- 11.4 针对集的优化考虑 213
- 11.5 领域对象 213
- 11.6 避免终结化 216
- 11.6.1 血泪史:忘记清理 217
- 11.6.2 为什么不使用终结化来解决这个问题 217
- 11.6.3 try-with-resources 219
- 11.7 方法句柄 223
- 11.8 小结 226
- 第 12 章 并发性能技术 227
- 12.1 并行介绍 228
- 12.2 理解JMM 232
- 12.3 构建并发库 236
- 12.3.1 Unsafe 237
- 12.3.2 原子与CAS 238
- 12.3.3 锁和自旋锁 239
- 12.4 并发库总结 240
- 12.4.1 java.util.concurrent中的Lock 240
- 12.4.2 读/ 写锁 241
- 12.4.3 信号量 242
- 12.4.4 并发集合 242
- 12.4.5 锁存器和屏障 243
- 12.5 执行器和任务抽象 245
- 12.5.1 认识异步执行 245
- 12.5.2 选择一个ExecutorService 246
- 12.5.3 Fork/Join 246
- 12.6 现代Java并发 248
- 12.6.1 流和并行流 248
- 12.6.2 无锁技术 249
- 12.6.3 基于Actor的技术 250
- 12.7 小结 251
- 第 13 章 剖析 252
- 13.1 认识剖析 252
- 13.2 采样与安全点偏差 253
- 13.3 面向开发人员的执行剖析工具 255
- 13.3.1 VisualVM剖析器 255
- 13.3.2 JProfiler 256
- 13.3.3 YourKit 261
- 13.3.4 Java Flight Recorder和Java Mission Control 262
- 13.3.5 运维工具 266
- 13.4 现代剖析器 269
- 13.5 分配剖析器 272
- 13.6 堆转储分析 278
- 13.7 小结 280
- 第 14 章 高性能日志和消息系统 281
- 14.1 日志 282
- 14.2 设计一个影响较低的日志记录器 284
- 14.3 使用Real Logic库实现低延迟 286
- 14.3.1 Agrona 287
- 14.3.2 Simple Binary Encoding 291
- 14.3.3 Aeron 294
- 14.3.4 Aeron的设计 296
- 14.4 小结 299
- 第 15 章 Java 9以及Java的未来方向 300
- 15.1 Java 9中小的性能增强 301
- 15.1.1 分段式代码缓存 301
- 15.1.2 紧凑的字符串 301
- 15.1.3 新的字符串连接 302
- 15.1.4 C2编译器的改进 303
- 15.1.5 新版G1收集器 304
- 15.2 Java 10和未来版本 305
- 15.2.1 新的发布流程 305
- 15.2.2 Java 10 305
- 15.3 Java 9及更高版本中的Unsafe 307
- 15.4 Valhalla项目和值类型 308
- 15.5 Graal和Truffle 312
- 15.6 字节码的未来方向 313
- 15.7 并发的未来方向 315
- 15.8 总结 316
- 作者介绍 318
- 封面介绍 318