《Java性能权威指南(第2版)》是由人民邮电出版社出版的一本关于Java指南方面的书籍,作者是斯科特·奥克斯(Scott、Oaks),主要介绍了关于Java、Java指南方面的知识内容,目前在Java指南类书籍综合评分为:7.2分。
书籍介绍
内容简介
本书从JVM和Java API两个方面,深入地介绍了Java 8和Java 11等新的Java长期支持版本中影响性能的因素。本书先从Java应用程序的通用方法、基准测试的缺陷、性能监控工具等方面,分析了如何通过JVM的配置方式影响程序的性能;接着从即时编译、垃圾回收、堆内存与原生内存实践、线程与同步的性能等方面,分析了常见的优化方向及其特性。第2版专注于更加成熟的Java 8和Java 11,主要的更新内容涉及G1垃圾回收器和Java飞行记录器,以及Java在容器化环境下的性能变化。
目录
- 前言 xiii
- 第 1章导论 1
- 1.1概述 2
- 1.2平台和约定 2
- 1.2.1Java平台 2
- 1.2.2硬件平台 4
- 1.3全面的性能 6
- 1.3.1写出更好的算法 6
- 1.3.2写更少的代码 7
- 1.3.3过早优化 8
- 1.3.4其他:数据库永远是瓶颈 9
- 1.3.5常见优化 9
- 1.4小结 10
- 第 2章性能测试方法 11
- 2.1测试真实的应用程序 11
- 2.1.1微基准测试 11
- 2.1.2宏基准测试 15
- 2.1.3介基准测试 16
- 2.2理解吞吐量、批处理时间和响应时间 17
- 2.2.1测量批处理时间17
- 2.2.2测量吞吐量18
- 2.2.3测量响应时间 19
- 2.3理解可变性22
- 2.4早测试、常测试 25
- 2.5基准测试示例 27
- 2.5.1Java 微基准测试工具 27
- 2.5.2常用代码示例 34
- 2.6小结 36
- 第3 章Java 性能工具箱 38
- 3.1操作系统工具和分析 38
- 3.1.1CPU 使用率 39
- 3.1.2CPU 运行队列 41
- 3.1.3磁盘使用率 42
- 3.1.4网络使用率 44
- 3.2Java 监控工具 45
- 3.2.1基本的VM 信息 46
- 3.2.2线程信息 48
- 3.2.3类信息 49
- 3.2.4实时GC 分析 49
- 3.2.5堆转储后期处理 49
- 3.3性能分析工具 49
- 3.3.1采样分析器 50
- 3.3.2探查分析器 53
- 3.3.3阻塞方法和线程时间线 54
- 3.3.4原生分析器 55
- 3.4JFR 57
- 3.4.1Java Mission Control 57
- 3.4.2JFR 概览 58
- 3.4.3开启JFR 64
- 3.4.4选择JFR 事件 67
- 3.5小结 69
- 第4 章使用即时编译器 70
- 4.1即时编译器:概览 70
- 4.2分层编译 73
- 4.3常用的编译器标志 74
- 4.3.1优化代码缓存 74
- 4.3.2检查编译过程 75
- 4.3.3分层编译级别 78
- 4.3.4逆优化 79
- 4.4高级编译器标志 82
- 4.4.1编译阈值 82
- 4.4.2编译线程 83
- 4.4.3内联 85
- 4.4.4逃逸分析 86
- 4.4.5CPU 相关代码 87
- 4.5分层编译的权衡 88
- 4.6GraalVM 89
- 4.7预编译 90
- 4.7.1提前编译 90
- 4.7.2GraalVM 原生编译 92
- 4.8小结 93
- 第5 章垃圾回收简介 95
- 5.1垃圾回收概览 95
- 5.1.1分代垃圾回收器97
- 5.1.2GC 算法99
- 5.1.3选择GC 算法101
- 5.2GC 优化基础108
- 5.2.1调整堆的大小 108
- 5.2.2调整分代大小 110
- 5.2.3调整元空间大小 112
- 5.2.4控制并行113
- 5.3GC 工具114
- 5.3.1在JDK 8 中开启GC 日志 114
- 5.3.2在JDK 11 中开启GC 日志 115
- 5.4小结 118
- 第6 章垃圾回收算法 119
- 6.1理解Throughput 回收器 119
- 6.2理解G1 垃圾回收器 125
- 6.3理解CMS 回收器 136
- 6.4高级优化 143
- 6.4.1晋升和Survivor 空间143
- 6.4.2分配大对象 146
- 6.4.3AggressiveHeap 标志 152
- 6.4.4完全掌控堆的大小 153
- 6.5实验性GC 算法 154
- 6.5.1并发压缩:ZGC 和Shenandoah 154
- 6.5.2无回收:Epsilon GC 156
- 6.6小结157
- 第7 章堆内存实践 159
- 7.1堆分析 159
- 7.1.1堆直方图160
- 7.1.2堆转储161
- 7.1.3内存溢出错误 164
- 7.2减少内存使用 168
- 7.2.1减小对象大小 169
- 7.2.2使用延迟初始化171
- 7.2.3使用不可变对象和标准化对象 175
- 7.3对象生命周期管理 176
- 7.3.1对象重用177
- 7.3.2软引用、弱引用和其他引用181
- 7.3.3压缩的普通对象指针193
- 7.4小结194
- 第8 章原生内存实践195
- 8.1内存占用195
- 8.1.1测量内存占用 196
- 8.1.2小化内存占用197
- 8.1.3原生内存跟踪 197
- 8.1.4共享库原生内存201
- 8.2针对操作系统的JVM 优化 204
- 8.3小结208
- 第9 章线程和同步性能 209
- 9.1线程和硬件209
- 9.2线程池和ThreadPoolExecutor 210
- 9.2.1设置线程数210
- 9.2.2设置小线程数213
- 9.2.3线程池任务大小215
- 9.2.4设置ThreadPoolExecutor 的大小215
- 9.3ForkJoinPool.217
- 9.3.1工作窃取 221
- 9.3.2自动并行化 223
- 9.4线程同步 224
- 9.4.1同步的代价 225
- 9.4.2避免同步 228
- 9.4.3伪共享 230
- 9.5JVM 线程优化 233
- 9.5.1优化线程栈大小 234
- 9.5.2偏向锁234
- 9.5.3线程优先级 235
- 9.6监控线程和锁 235
- 9.6.1查看线程235
- 9.6.2查看阻塞线程 236
- 9.7小结239
- 第 10 章Java 服务器 240
- 10.1Java NIO 概览 240
- 10.2服务器容器 242
- 10.2.1优化服务器线程池 242
- 10.2.2异步Rest 服务器 243
- 10.3异步出站调用246
- 10.4JSON 处理251
- 10.4.1解析和编组概览 252
- 10.4.2JSON 对象 253
- 10.4.3JSON 解析 254
- 10.5小结 256
- 第 11 章数据库性能实践 257
- 11.1示例数据库 258
- 11.2JDBC 258
- 11.2.1JDBC 驱动 258
- 11.2.2JDBC 连接池 260
- 11.2.3预处理语句和语句池 261
- 11.2.4事务 262
- 11.2.5结果集处理269
- 11.3JPA270
- 11.3.1优化JPA 写 271
- 11.3.2优化JPA 读 272
- 11.3.3JPA 缓存 275
- 11.4Spring Data280
- 11.5小结281
- 第 12 章Java SE API 技巧282
- 12.1字符串 282
- 12.1.1压缩字符串 282
- 12.1.2重复字符串和字符串保留283
- 12.1.3字符串连接 288
- 12.2缓冲I/O 291
- 12.3类加载 293
- 12.4随机数 296
- 12.5Java 原生接口298
- 12.6异常300
- 12.7日志303
- 12.8Java 集合API304
- 12.8.1同步和非同步305
- 12.8.2设置集合大小306
- 12.8.3集合与内存效率 307
- 12.9Lambda 和匿名类 308
- 12.10流和过滤器的性能310
- 12.11对象序列化 312
- 12.11.1瞬时字段312
- 12.11.2覆盖默认的序列化313
- 12.11.3压缩序列化数据 315
- 12.11.4跟踪重复对象317
- 12.12小结 319
- 附录调优标志总结 321