6时间换空间63
2.2.7空间换时间64
2.3小结66
第3章Java程序优化67
3.1字符串优化处理67
3.1.1String对象及其特点67
3.1.2substring()方法的内存泄漏69
3.1.3字符串分割和查找72
3.1.4StringBuffer和StringBuilder76
3.1.5CompactStrings优化字符串存储80
3.2核心数据结构81
3.2.1List接口81
3.2.2Map接口88
3.2.3Set接口100
3.2.4优化集合访问代码101
3.2.5RandomAccess接口103
3.3使用NIO提升性能105
3.3.1NIO中的Buffer类族和Channel106
3.3.2Buffer的基本原理107
3.3.3Buffer的相关操作109
3.3.4MappedByteBuffer性能评估116
3.3.5直接访问内存119
3.4引用类型121
3.4.1强引用121
3.4.2软引用122
3.4.3弱引用123
3.4.4虚引用124
3.4.5WeakHashMap类及其实现127
3.5性能测试工具JMH129
3.5.1JMH之HelloWorld130
3.5.2JMH之指定测量模式131
3.5.3JMH之对象作用域134
3.5.4JMH之代码消除135
3.6有助于改善性能的技巧137
3.6.1使用局部变量137
3.6.2位运算代替乘除法138
3.6.3替换switch139
3.6.4一维数组代替二维数组141
3.6.5提取表达式142
3.6.6展开循环143
3.6.7布尔运算代替位运算144
3.6.8使用arrayCopy()145
3.6.9使用Buffer进行I/O操作147
3.6.10使用clone()代替new149
3.6.11慎用Java函数式编程151
3.7小结152
第4章并行程序开发及优化153
4.1并行程序设计模式153
4.1.1Future模式153
4.1.2Master-Worker模式161
4.1.3GuardedSuspension模式165
4.1.4不变模式172
4.1.5生产者-消费者模式174
4.2JDK多任务执行框架178
4.2.1无限制线程的缺陷178
4.2.2简单的线程池实现179
4.2.3Executor框架183
4.2.4自定义线程池185
4.2.5优化线程池大小189
4.2.6扩展ThreadPoolExecutor189
4.3JDK并发数据结构191
4.3.1并发List191
4.3.2并发Set193
4.3.3并发Map194
4.3.4并发Queue195
4.3.5并发Deque197
4.4并发控制方法199
4.4.1Java内存模型与volatile199
4.4.2同步关键字synchronized203
4.4.3重入锁205
4.4.4读写锁207
4.4.5读写锁的改进:StampedLock209
4.4.6Condition对象210
4.4.7信号量212
4.4.8线程局部变量ThreadLocal214
4.5锁的性能和优化215
4.5.1线程的开销215
4.5.2避免死锁215
4.5.3减少锁持有时间219
4.5.4减小锁粒度220
4.5.5读写分离锁来替换独占锁221
4.5.6锁分离222
4.5.7重入锁和内部锁224
4.5.8锁粗化224
4.5.9自旋锁226
4.5.10锁消除226
4.5.11锁偏向227
4.6无锁的并行计算228
4.6.1非阻塞的同步/无锁228
4.6.2原子操作228
4.6.3Amino框架简介231
4.6.4Amino集合231
4.6.5Amino树236
4.6.6Amino图237
4.6.7Amino简单调度模式238
4.7协程240
4.7.1协程的概念240
4.7.2Kilim框架简介241
4.7.3Task及其状态242
4.7.4Fiber及其状态242
4.7.5Kilim开发环境配置243
4.7.6Kilim之HelloWorld244
4.7.7多任务通信246
4.7.8Kilim实例及性能评估247
4.8小结250
第5章JVM调优251
5.1Java虚拟机内存模型251
5.1.1程序计数器251
5.1.2Java虚拟机栈252
5.1.3本地方法栈258
5.1.4Java堆258
5.1.5方法区260
5.2JVM内存分配参数263
5.2.1设置最大堆内存264
5.2.2设置最小堆内存264
5.2.3设置新生代266
5.2.4设置持久代266
5.2.5设置线程栈267
5.2.6堆的比例分配269
5.2.7堆分配参数总结270
5.3垃圾收集基础271
5.3.1垃圾收集的作用272
5.3.2垃圾回收算法与思想272
5.3.3垃圾回收器的类型277
5.3.4评价GC策略的指标278
5.3.5新生代串行回收器278
5.3.6老年代串行回收器279
5.3.7并行回收器280
5.3.8新生代并行回收器281
5.3.9老年代并行回收器282
5.3.10CMS回收器282
5.3.11G1回收器285
5.3.12StoptheWorld案例286
5.3.13垃圾回收器对系统性能的影响288
5.3.14GC操作相关参数总结289
5.4常用调优案例和方法291
5.4.1将新对象预留在新生代291
5.4.2大对象进入老年代294
5.4.3设置对象进入老年代的年龄296
5.4.4稳定与振荡的堆大小296
5.4.5吞吐量优先案例298
5.4.6使用大页案例298
5.4.7降低停顿案例299
5.5实用JVM参数299
5.5.1JIT编译参数299
5.5.2堆快照301
5.5.3错误处理302
5.5.4获取GC信息302
5.5.5类和对象跟踪304
5.5.6控制GC305
5.5.7选择类校验器305
5.5.8Solaris下的线程控制306
5.5.9使用大页306
5.5.10压缩指针306
5.6JVM调优实战306
5.6.1Tomcat简介与启动加速307
5.6.2Web应用程序简介309
5.6.3JMeter简介与使用310
5.6.4调优前Web应用运行状况313
5.6.5调优过程314
5.7小结315
第6章Java性能调优工具316
6.1Linux命令行工具316
6.1.1top命令316
6.1.2sar命令318
6.1.3vmstat命令319
6.1.4iostat命令321
6.1.5pidstat工具322
6.2Windows工具326
6.2.1任务管理器326
6.2.2perfmon性能监控工具328
6.2.3ProcessExplorer工具331
6.2.4pslist命令行333
6.3JDK命令行工具334
6.3.1jps命令335
6.3.2jstat命令336
6.3.3jinfo命令339
6.3.4jmap命令340
6.3.5jhat命令341
6.3.6jstack命令343
6.3.7jstatd命令346
6.3.8hprof工具347
6.3.9jcmd命令349
6.4JConsole工具350
6.4.1JConsole连接Java程序350
6.4.2Java程序概况351
6.4.3内存监控352
6.4.4线程监控352
6.4.5类加载情况354
6.4.6虚拟机信息354
6.4.7MBean管理355
6.4.8使用插件356
6.5VisualVM多合一工具357
6.5.1VisualVM连接应用程序358
6.5.2监控应用程序概况359
6.5.3ThreadDump和分析361
6.5.4性能分析362
6.5.5快照365
6.5.6内存快照分析365
6.5.7MBean管理功能367
6.5.8TDA的使用367
6.5.9BTrace简介368
6.6VisualVM对OQL的支持374
6.6.1VisualVM的OQL基本语法374
6.6.2内置heap对象375
6.6.3对象函数376
6.6.4集合/统计函数380
6.6.5程序化OQL384
6.7MAT内存分析工具386
6.7.1初识MAT386
6.7.2浅堆和深堆389
6.7.3支配树392
6.7.4垃圾回收根394
6.7.5内存泄漏检测395
6.7.6最大对象报告396
6.7.7查找支配者396
6.7.8线程分析397
6.7.9集合使用情况分析398
6.7.10扩展MAT399
6.8MAT对OQL的支持403
6.8.1Select子句404
6.8.2From子句406
6.8.3Where子句407
6.8.4内置对象与方法408
6.9来自JRockit的礼物——JMC411
6.9.1得到JFR文件412
6.9.2Java程序的整体运行情况413
6.9.3CPU分析413
6.9.4内存分析414
6.9.5I/O分析416
6.10小结418