译者序 1
序言 3
第一部分:策略 7
第1章 性能是什么? 9
1.1 计算性能 10
1.2 内存驻留 10
1.3 启动时间 10
1.4 伸缩性 11
1.5 观测性能 12
第2章 性能过程 15
2.1 性能过程 15
2.1.1 分析 16
2.1.2 面向对象设计 17
2.1.3 编码 18
2.1.4 测试 18
2.1.5 资源分布分析 19
2.2 面向对象设计的参考书目 19
第3章 测量是一切 21
3.1 基准测试 21
3.1.1 为什么要建立基准测试 25
3.1.2 微基准测试 26
3.1.3 宏基准测试 26
3.1.4 分析基准测试 28
3.2 资源分布分析 29
3.2.1 分析方法执行的次数 30
3.2.2 分析内存驻留 31
3.2.3 分析内存泄漏 32
3.3 处理平滑的资源分布分析数据 33
3.3.1 一个平滑的资源分布数据的实例 35
第二部分:技巧 37
第4章 I/O性能 39
4.1 基本I/O 39
4.1.1 缓冲流 40
4.1.2 自定义缓冲 42
4.1.3 进一步改进 45
4.2 序列化 45
4.2.1 序列化示例 45
4.2.2 改进的序列化示例 47
4.2.3 分析持久状态 49
第5章 内存驻留 51
5.1 计算内存驻留 51
5.1.1 计算内存的使用 51
5.1.2 测量程序的实际内存驻留 52
5.2 什么影响了内存驻留 53
5.2.1 对象 54
5.2.2 类 59
5.2.3 线程 59
5.2.4 本地数据结构 60
5.2.5 本地库 60
5.3 类装载 60
5.3.1 测量类装载 60
第6章 控制类装载 63
6.1 过早类装载 63
6.1.1 控制过早装载 65
6.2 减少类的数量 66
6.2.1 简单内部类 66
6.2.2 合并监听者 68
6.2.3 应用反射 69
6.2.4 应用代理 70
6.2.5 谁真正应用了这些技巧? 72
6.3 运行多个程序 73
6.3.1 办公套件示例 73
6.3.2 在同一个虚拟机上运行 74
6.3.3 一个更好的触发程序 79
第7章 对象可变性:字符串及其它 81
7.1 大量小对象 82
7.2 处理字符串对象 82
7.3 AWT和Swing中的可变对象 84
7.3.1 消除临时对象 85
7.4 其它处理可变对象的技巧 86
7.4.1 模拟const 86
7.5 可变对象的实例研究 92
7.6 小对象及当今JVM 92
7.6.1 对象池 93
7.7 数组可变性 94
第8章 算法和数据结构 97
8.1 算法选择 97
8.1.1 算法比较 98
8.1.2 追求优雅 99
8.1.3 考虑问题空间 101
8.2 应用递归算法 106
8.3 超越简单算法 110
8.4 选择数据结构 110
8.4.1 Java 2集合 111
8.4.2 集合接口 111
8.4.3 Collection接口 112
8.4.4 List对象 113
8.4.5 Set对象 113
8.4.6 Map对象 114
8.4.7 同步集合 114
8.4.8 集合框架的算法 115
8.4.9 普通数组 115
8.4.10 不可变集合 116
8.5 集合示例 116
8.5.1 集合基准测试的结果 118
8.6 算法和数据结构的参考 120
第9章 使用本地代码 121
9.1 本地图示例 121
9.1.1 与本地代码的比较 125
9.2 检测JNI开销 126
9.2.1 Java拷贝 129
9.2.2 JNI模式 129
9.2.3 模式1:Call模式 129
9.2.4 模式2:Call-Pull模式 130
9.2.5 模式3:Call-Pull-Push模式 131
9.2.6 模式3(变量):Call-Pull-Push with Critical模式 132
9.2.7 模式4:Call-Invoke 134
9.3 本地代码的实例研究 134
9.3.1 Java多媒体框架(Java Media Framework) 135
9.3.2 Java.math包 135
9.3.3 Java 3D 135
第10章 Swing模型与表示者 137
10.1 Swing的组件架构 137
10.2 可伸缩组件 139
10.2.1 表示者 139
10.2.2 模型 140
10.2.3 例子:简单的电子表 142
10.2.4 应用定制模型 142
10.2.5 应用定制的表示者 144
10.2.6 一起使用定制模型和表示者 147
第11章 用Swing编写响应灵敏的用户界面 151
11.1 编写响应灵敏GUIs的指引 151
11.1.1 先设计,后构建(重复) 152
11.1.2 用户决定性能要求 152
11.2 在Swing程序中应用线程 153
11.2.1 单线程规则 154
11.2.2 在事件分发中应用invokeLater和invokeAndWait 155
11.3 在Swing应用中应用定时器(timer) 157
11.3.1 定时器如何工作 157
11.3.2 没有定时器的代码 158
11.3.3 Swing的定时器类 159
11.3.4 公共Timer类和TimerTask类 160
11.3.5 如何选择一个定时器类 161
11.3.6 定时器实例 162
11.4 应用线程创建响应灵敏的程序 164
11.5 例子:搜索web 165
11.5.1 工作线程的优先级 166
11.5.2 中断工作线程 167
第12章 部署 169
12.1 编译器选项 169
12.2 Jar文件 170
12.2.1 减小程序大小 170
12.2.2 减少下载时间 170
12.2.3 JAR文件及资源文件 171
12.3 包(packaging)工具 172
12.4 动态下载 172
12.4.1 Applet缓冲 173
附录 175
A 垃圾回收的真相 177
A.1 为什么要关心垃圾回收? 177
A.2 GC的承诺 178
A.3 对象的生命周期 178
A.3.1 创建 178
A.3.2 在用 179
A.3.3 不可见 180
A.3.4 不可达 180
A.3.5 已回收 181
A.3.6 终止 182
A.3.7 释放 182
A.4 引用对象 182
A.4.1 引用对象的类型 183
A.4.2 GC弱引用的例子 184
A.5 垃圾回收参考书目 185
B Java HotSpot虚拟机 187
B.1 HotSpot架构 187
B.1.1 HotSpot的两个版本 188
B.2 运行期系统特性 188
B.2.1 内存分配和垃圾回收 190
B.2.2 线程同步 191
B.3 HotSpot服务器编译器 192
B.3.1 积极内联 192
B.3.2 其它优化技术 193
B.3.3 数组边界检查 193
B.4 -X标志 193
B.4.1 -Xnoclassgc 194
B.4.2 -Xincgc 194
B.4.3 -Xbatch 194
B.4.4 -Xms 194
B.4.5 -Xmx 194
B.4.6 -Xprof 194
B.5 -XX标志 196
B.5.1 -XX标志的类型 196
B.5.2 PrintBytecodeHistogram 196
B.5.3 CompileThreshold 197
B.5.4 NewSize 197