第一部分 概述 1
第1章 一般性能 1
1.1 性能与优化 1
1.2 性能的生命周期 2
1.2.1 编码前 2
1.2.2 编码期间 4
1.2.3 编码后 8
1.3 性能问题的类型 8
1.4 简单性能层 9
1.5 应用程序设计层 9
1.5.1 不好的设计选择 9
1.5.2 信息隐藏 10
1.6 物理层 11
1.6.1 Java 语言及其环境 11
1.6.2 Java 与其他环境的交互 12
1.6.3 持久 Java 对象 13
1.6.4 时间、距离和空间 14
第2章 识别 Java 性能的工具 16
2.1 Java 特有的工具 16
2.1.1 Java 分析工具 16
2.1.2 第三方 Java 分析工具 17
2.1.3 简单的计时测量 18
2.1.4 Verbosegc 选项 19
2.2 PerfMonitor 类 20
2.3 系统工具:Windows NT 性能监视器 27
2.4 本章小结 29
第3章 Java 性能问题涉及的领域 30
3.1 基本的计时比较 30
3.2 即时编译和静态编译 33
3.3 创建和重用对象 33
3.4 使用常量 38
3.5 使用字符串 38
3.6 异常的用法 44
3.7 循环技术 44
3.7.1 循环常量 44
3.7.2 本地变量 45
3.7.3 尽早地终止循环 46
3.8 造型技术 46
3.8.1 避免丢失类信息 46
3.8.2 避免 Instanceof 和造型相邻使用 47
3.8.3 避免不必要的造型和 Instanceof 48
3.9 同步 49
3.10 垃圾回收 49
3.11 集合 51
3.11.1 集合框架 51
3.11.2 一般用途的实现 53
3.11.3 向量 54
3.11.4 哈希表 54
3.12 本章小结 56
第二部分 物理性能 57
第4章 本地/远程问题 57
4.1 实现远程对象的可能途径 57
4.1.1 远程方法调用 58
4.1.2 企业级 Java Bean 59
4.1.3 SanFrancisco 的基础层 60
4.2 远程访问的开销 61
4.2.1 如何在 Java 中书写和使用远程服务程序 61
4.2.2 改变方法调用的粒度 66
4.2.3 远程访问的谱线 69
4.2.4 对象粒度 70
4.2.5 性能粒度的含义 71
4.2.6 正确放置数据 72
4.2.7 对象的亲合力 73
4.2.8 划分 73
4.3 本章小结 77
第5章 粒度 78
5.1 接口粒度 78
5.2 实现粒度 79
5.3 粒度和性能 79
5.3.1 例1:一个细粒度设计 80
5.3.2 例2:串行化定单行对象 88
5.4 本章小结 93
6.2 同步瓶颈 94
6.1 为什么很难避免瓶颈 94
第6章 瓶颈 94
6.3 加锁瓶颈 99
6.3.1 对象和加锁 100
6.3.2 死锁和锁排序 105
6.4 垃圾回收瓶颈 107
6.5 分布式垃圾回收 114
6.6 本章小结 115
第三部分 基准测试 117
第7章 Java 基准测试概述 117
7.1 Java 测试程序 118
7.1.1 Pendragon Software CaffeineMark 3.0 118
7.1.2 JMark 2.0 121
7.1.3 VolanoMark 2.1 123
7.1.4 SPECjvm 98 124
7.2 一个简单的测试程序 126
7.3 本章小结 141
第8章 应用级基准测试 142
8.1 BOB 基准测试 142
8.1.1 TPC-C 概述 143
8.1.2 BOB 结构 145
8.2 BOB 的运行 146
8.3 BOB 的实现 150
8.3.1 测试程序基础结构 150
8.3.2 测试程序事务 156
8.4 测试程序实体 159
8.5 本章小结 161
第四部分 应用程序环境 163
第9章 SanFrancisco 及其性能 163
9.1 SanFrancisco 概述 163
9.2 基础层 165
9.2.1 基础层对象模型基类 165
9.2.2 业务对象的生命周期 168
9.2.3 实体的生命周期 169
9.2.4 集合和查询 171
9.2.5 其他基类 174
9.2.6 基础对象模型服务 175
9.3 通用业务对象层 180
9.4 核心业务处理层 183
9.5 有用的参考资料 185
9.5.1 有关 SanFrancisco 的书籍 185
9.5.2 有关 SanFrancisco 的文章 185
9.5.3 有关 SanFrancisco 的 IBM Redbooks 186
9.6 本章小结 186
第10章 企业级 Java Beans 及其性能 187
10.1 J2EE 体系结构和技术 187
10.2 企业级 Java Beans 189
10.2.1 选择一个实现 189
10.2.2 EJB 的实现及其性能 189
10.3.1 Session Bean 190
10.3 EJB 体系结构及其性能 190
10.3.2 Entity Bean 192
10.3.3 Entity Bean 的特点 193
10.3.4 EJB 的粒度 194
10.3.5 Session Bean 和 Entity Bean 的比较 194
10.4 EJS 中的特性研究 195
10.5 本章小结 195
第11章 CORBA 及 Java 196
11.1 CORBA 概述 196
11.2 Java IDL 197
11.3 RMI-IIOP 197
11.5 本章小结 203
11.4 RMI over IIOP 的性能影响 203
第12章 Jini 及其性能 204
12.1 Jini 概述 204
12.1.1 查找 205
12.1.2 发现 205
12.1.3 租借 205
12.1.4 远程事件 206
12.1.5 事务 206
12.2 Jini 中的性能考虑 207
12.3 本章小结 207
第五部分 应用程序模型 209
第13章 Java 的使用 209
13.2 网内 210
13.1 网外 210
13.3 应用程序连接 211
13.4 数据库上 212
13.5 应用程序包装 213
13.6 对象下 214
13.7 组合方法 215
13.8 本章小结 216
第14章 性能含义 217
14.1 网外 217
14.2 网内 218
14.3.1 字符编码及尾数 220
14.3 应用程序连接 220
14.3.2 远程对象的累积 223
14.4 应用程序包装 223
14.4.1 过多的客户交互 224
14.4.2 容量限制 225
14.4.3 减少客户-服务器交互 225
14.5 数据库上 226
14.6 对象下 227
14.6.1 过多的客户交互 228
14.6.2 过多的远程对象交互 229
14.6.3 过多的中件交互 231
14.6.4 内存泄漏和对象驻留 242
14.6.5 过多的垃圾回收 246
14.7 本章小结 247
第15章 系统调整 249
15.1 调整内存和系统 249
第六部分 扩大应用程序规模 249
15.1.1 SanFrancisco 解决方案 250
15.1.2 EJB 解决方案 250
15.1.3 调整数据库 250
15.1.4 操作系统内存分配 251
15.1.5 平衡内存要求 252
15.2 磁盘配置 253
15.3 网络配置 254
15.4 性能调整的过程 254
15.5 本章小结 256
16.1 应用程序及其环境 257
第16章 大规模的影响 257
16.1.1 内存 258
16.1.2 处理器 259
16.1.3 输入/输出 260
16.1.4 软件 260
16.2 大规模的影响 260
16.3 SMP 和堆影响 261
16.3.1 在 SMP 上的堆分配和垃圾回收 261
16.3.2 为什么需要多重服务器 263
16.3.3 对象的布局、访问和复制 264
16.4 本章小结 265
附录 A 使用的机器 266