和分析38
3.1.1 CPU使用率39
3.1.2 CPU运行队列41
3.1.3 磁盘使用率42
3.1.4 网络使用率44
3.2 Java监控工具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.4 JFR57
3.4.1 JavaMissionControl57
3.4.2 JFR概览58
3.4.3 开启JFR64
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.5 CPU相关代码87
4.5 分层编译的权衡88
4.6 GraalVM89
4.7 预编译90
4.7.1 提前编译90
4.7.2 GraalVM原生编译92
4.8 小结93
第5章 垃圾回收简介95
5.1 垃圾回收概览95
5.1.1 分代垃圾回收器97
5.1.2 GC算法99
5.1.3 选择GC算法101
5.2 GC优化基础108
5.2.1 调整堆的大小108
5.2.2 调整分代大小110
5.2.3 调整元空间大小112
5.2.4 控制并行113
5.3 GC工具114
5.3.1 在JDK8中开启GC日志114
5.3.2 在JDK11中开启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.3 AggressiveHeap标志152
6.4.4 完全掌控堆的大小153
6.5 实验性GC算法154
6.5.1 并发压缩:ZGC和Shenandoah154
6.5.2 无回收:EpsilonGC156
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 线程池和ThreadPoolExecutor210
9.2.1 设置最大线程数210
9.2.2 设置最小线程数213
9.2.3 线程池任务大小215
9.2.4 设置ThreadPoolExecutor的大小215
9.3 ForkJoinPool.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.5 JVM线程优化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.1 JavaNIO概览240
10.2 服务器容器242
10.2.1 优化服务器线程池242
10.2.2 异步Rest服务器243
10.3 异步出站调用246
10.4 JSON处理251
10.4.1 解析和编组概览252
10.4.2 JSON对象253
10.4.3 JSON解析254
10.5 小结256
第11章 数据库性能最佳实践257
11.1 示例数据库258
11.2 JDBC258
11.2.1 JDBC驱动258
11.2.2 JDBC连接池260
11.2.3 预处理语句和语句池261
11.2.4 事务262
11.2.5 结果集处理269
11.3 JPA270
11.3.1 优化JPA写271
11.3.2 优化JPA读272
11.3.3 JPA缓存275
11.4 SpringData280
11.5 小结281
第12章 JavaSEAPI技巧282
12.1 字符串282
12.1.1 压缩字符串282
12.1.2 重复字符串和字符串保留283
12.1.3 字符串连接288
12.2 缓冲I/O291
12.3 类加载293
12.4 随机数296
12.5 Java原生接口298
12.6 异常300
12.7 日志303
12.8 Java集合API304
12.8.1 同步和非同步305
12.8.2 设置集合大小306
12.8.3 集合与内存效率307
12.9 Lambda和匿名类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