推荐序 xi
前言 xii
第1章 导论 1
1.1 概述 2
1.2 平台版本约定 2
1.3 全面的性能调优 4
1.3.1 编写更好的算法 4
1.3.2 编写更少的代码 4
1.3.3 老调重弹的过早优化 5
1.3.4 其他:数据库很可能就是瓶颈 6
1.3.5 常见的优化 7
1.4 小结 8
第2章 性能测试方法 9
2.1 原则1:测试真实应用 9
2.1.1 微基准测试 9
2.1.2 宏基准测试 13
2.1.3 介基准测试 15
2.1.4 代码示例 16
2.2 原则2:理解批处理流逝时间、吞吐量和响应时间 19
2.2.1 批处理流逝时间 19
2.2.2 吞吐量测试 20
2.2.3 响应时间测试 20
2.3 原则3:用统计方法应对性能的变化 23
2.4 原则4:尽早频繁测试 26
2.5 小结 28
第3章 Java性能调优工具箱 29
3.1 操作系统的工具和分析 29
3.1.1 CPU使用率 29
3.1.2 CPU运行队列 32
3.1.3 磁盘使用率 33
3.1.4 网络使用率 34
3.2 Java监控工具 35
3.2.1 基本的VM信息 36
3.2.2 线程信息 39
3.2.3 类信息 39
3.2.4 实时GC分析 39
3.2.5 事后堆转储 39
3.3 性能分析工具 39
3.3.1 采样分析器 40
3.3.2 探查分析器 41
3.3.3 阻塞方法和线程时间线 42
3.3.4 本地分析器 44
3.4 Java任务控制 45
3.4.1 Java飞行记录器 46
3.4.2 开启JFR 52
3.4.3 选择JFR事件 54
3.5 小结 56
第4章 JIT编译器 58
4.1 JIT 编译器:概览 58
4.2 调优入门:选择编译器类型(Client、Server 或二者同用) 61
4.2.1 优化启动 62
4.2.2 优化批处理 63
4.2.3 优化长时间运行的应用 64
4.3 Java和JIT编译器版本 64
4.4 编译器中级调优 67
4.4.1 调优代码缓存 67
4.4.2 编译阈值 68
4.4.3 检测编译过程 70
4.5 高级编译器调优 73
4.5.1 编译线程 73
4.5.2 内联 74
4.5.3 逃逸分析 75
4.6 逆优化 76
4.6.1 代码被丢弃 77
4.6.2 逆优化僵尸代码 78
4.7 分层编译级别 79
4.8 小结 80
第5章 垃圾收集入门 81
5.1 垃圾收集概述 81
5.1.1 分代垃圾收集器 83
5.1.2 GC算法 84
5.1.3 选择GC算法 87
5.2 GC调优基础 92
5.2.1 调整堆的大小 92
5.2.2 代空间的调整 95
5.2.3 永久代和元空间的调整 96
5.2.4 控制并发 97
5.2.5 自适应调整 98
5.3 垃圾回收工具 99
5.4 小结 102
第6章 垃圾收集算法 103
6.1 理解Throughput收集器 103
6.2 理解CMS收集器 109
6.2.1 针对并发模式失效的调优 113
6.2.2 CMS收集器的永久代调优 116
6.2.3 增量式CMS垃圾收集 117
6.3 理解G1垃圾收集器 118
6.4 高级调优 126
6.4.1 晋升及Survivor空间 126
6.4.2 分配大对象 129
6.4.3 AggressiveHeap标志 136
6.4.4 全盘掌控堆空间的大小 137
6.5 小结 138
第7章 堆内存最佳实践 140
7.1 堆分析 140
7.1.1 堆直方图 141
7.1.2 堆转储 142
7.1.3 内存溢出错误 146
7.2 减少内存使用 149
7.2.1 减少对象大小 149
7.2.2 延迟初始化 152
7.2.3 不可变对象和标准化对象 156
7.2.4 字符串的保留 157
7.3 对象生命周期管理 160
7.3.1 对象重用 160
7.3.2 弱引用、软引用与其他引用 165
7.4 小结 175
第8章 原生内存最佳实践 176
8.1 内存占用 176
8.1.1 测量内存占用 177
8.1.2 内存占用最小化 178