第一部分 走近Java 2
第1章 走近Java 2
1.1概述 2
1.2 Java技术体系 3
1.3 Java发展史 5
1.4展望Java技术的未来 9
1.4.1模块化 9
1.4.2混合语言 9
1.4.3多核并行 11
1.4.4进一步丰富语法 12
1.4.5 64位虚拟机 13
1.5实战:自己编译JDK 13
1.5.1获取JDK源码 13
1.5.2系统需求 14
1.5.3构建编译环境 15
1.5.4准备依赖项 17
1.5.5进行编译 18
1.6本章小结 21
第二部分 自动内存管理机制 24
第2章 Java内存区域与内存溢出异常 24
2.1概述 24
2.2运行时数据区域 25
2.2.1程序计数器 25
2.2.2 Java虚拟机栈 26
2.2.3本地方法栈 27
2.2.4 Java堆 27
2.2.5方法区 28
2.2.6运行时常量池 29
2.2.7直接内存 29
2.3对象访问 30
2.4实战:OutOfMemoryError异常 32
2.4.1 Java堆溢出 32
2.4.2虚拟机栈和本地方法栈溢出 35
2.4.3运行时常量池溢出 38
2.4.4方法区溢出 39
2.4.5本机直接内存溢出 41
2.5本章小结 42
第3章 垃圾收集器与内存分配策略 43
3.1概述 43
3.2对象已死? 44
3.2.1引用计数算法 44
3.2.2根搜索算法 46
3.2.3再谈引用 47
3.2.4生存还是死亡? 48
3.2.5回收方法区 50
3.3垃圾收集算法 51
3.3.1标记-清除算法 52
3.3.2复制算法 52
3.3.3标记-整理算法 54
3.3.4分代收集算法 54
3.4垃圾收集器 55
3.4.1 Serial收集器 56
3.4.2 ParNew收集器 57
3.4.3 Parallel Scavenge收集器 59
3.4.4 Serial Old收集器 60
3.4.5 Parallel Old收集器 61
3.4.6 CMS收集器 61
3.4.7 G1收集器 64
3.4.8垃圾收集器参数总结 64
3.5内存分配与回收策略 65
3.5.1对象优先在Eden分配 66
3.5.2大对象直接进入老年代 68
3.5.3长期存活的对象将进入老年代 69
3.5.4动态对象年龄判定 71
3.5.5空间分配担保 73
3.6本章小结 75
第4章 虚拟机性能监控与故障处理工具 76
4.1概述 76
4.2 JDK的命令行工具 76
4.2.1 jps:虚拟机进程状况工具 79
4.2.2 jstat:虚拟机统计信息监视工具 80
4.2.3 jinfo:Java配置信息工具 82
4.2.4 jmap:Java内存映像工具 82
4.2.5 jhat:虚拟机堆转储快照分析工具 84
4.2.6 jstack:Java堆栈跟踪工具 85
4.3 JDK的可视化工具 87
4.3.1 JConsole:Java监视与管理控制台 88
4.3.2 VisualVM:多合一故障处理工具 96
4.4本章小结 105
第5章 调优案例分析与实战 106
5.1概述 106
5.2案例分析 106
5.2.1高性能硬件上的程序部署策略 106
5.2.2集群间同步导致的内存溢出 109
5.2.3堆外内存导致的溢出错误 110
5.2.4外部命令导致系统缓慢 112
5.2.5服务器JVM进程崩溃 113
5.3实战:Eclipse运行速度调优 114
5.3.1调优前的程序运行状态 114
5.3.2升级JDK1.6的性能变化及兼容问题 117
5.3.3编译时间和类加载时间的优化 122
5.3.4调整内存设置控制垃圾收集频率 126
5.3.5选择收集器降低延迟 130
5.4本章小结 133
第三部分 虚拟机执行子系统 136
第6章 类文件结构 136
6.1概述 136
6.2无关性的基石 136
6.3 Class类文件的结构 138
6.3.1魔数与Class文件的版本 139
6.3.2常量池 141
6.3.3访问标志 147
6.3.4类索引、父类索引与接口索引集合 148
6.3.5字段表集合 149
6.3.6方法表集合 153
6.3.7属性表集合 155
6.4 Class文件结构的发展 168
6.5本章小结 170
第7章 虚拟机类加载机制 171
7.1概述 171
7.2类加载的时机 172
7.3类加载的过程 176
7.3.1加载 176
7.3.2验证 178
7.3.3准备 181
7.3.4解析 182
7.3.5初始化 186
7.4类加载器 189
7.4.1类与类加载器 189
7.4.2双亲委派模型 191
7.4.3破坏双亲委派模型 194
7.5本章小结 197
第8章 虚拟机字节码执行引擎 198
8.1概述 198
8.2运行时栈帧结构 199
8.2.1局部变量表 199
8.2.2操作数栈 204
8.2.3动态连接 206
8.2.4方法返回地址 206
8.2.5附加信息 207
8.3方法调用 207
8.3.1解析 207
8.3.2分派 209
8.4基于栈的字节码解释执行引擎 221
8.4.1解释执行 221
8.4.2基于栈的指令集与基于寄存器的指令集 223
8.4.3基于栈的解释器执行过程 224
8.5本章小结 230
第9章 类加载及执行子系统的案例与实战 231
9.1概述 231
9.2案例分析 231
9.2.1 Tomcat:正统的类加载器架构 232
9.2.2 OSGi:灵活的类加载器架构 235
9.2.3字节码生成技术与动态代理的实现 238
9.2.4 Retrotranslator:跨越JDK版本 242
9.3实战:自己动手实现远程执行功能 246
9.3.1目标 246
9.3.2思路 247
9.3.3实现 248
9.3.4验证 255
9.4本章小结 256
第四部分 程序编译与代码优化 258
第10章 早期(编译期)优化 258
10.1概述 258
10.2 Javac编译器 259
10.2.1 Javac的源码与调试 259
10.2.2解析与填充符号表 262
10.2.3注解处理器 264
10.2.4语义分析与字节码生成 264
10.3 Java语法糖的味道 268
10.3.1泛型与类型擦除 268
10.3.2自动装箱、拆箱与遍历循环 273
10.3.3条件编译 275
10.4实战:插入式注解处理器 276
10.4.1实战目标 276
10.4.2代码实现 277
10.4.3运行与测试 284
10.4.4其他应用案例 286
10.5本章小结 286
第11章 晚期(运行期)优化 287
11.1概述 287
11.2 HotSpot虚拟机内的即时编译器 288
11.2.1解释器与编译器 288
11.2.2编译对象与触发条件 291
11.2.3编译过程 294
11.2.4查看与分析即时编译结果 297
11.3编译优化技术 301
11.3.1优化技术概览 301
11.3.2公共子表达式消除 305
11.3.3数组边界检查消除 307
11.3.4方法内联 307
11.3.5逃逸分析 309
11.4 Java与C C++的编译器对比 311
11.5本章小结 313
第五部分 高效并发 316
第12章 Java内存模型与线程 316
12.1概述 316
12.2硬件的效率与一致性 317
12.3 Java内存模型 318
12.3.1主内存与工作内存 319
12.3.2内存间交互操作 320
12.3.3对于volatile型变量的特殊规则 322
12.3.4对于long和double型变量的特殊规则 327
12.3.5原子性、可见性与有序性 328
12.3.6先行发生原则 330
12.4 Java与线程 333
12.4.1线程的实现 333
12.4.2 Java线程调度 337
12.4.3状态转换 339
12.5本章小结 341
第13章 线程安全与锁优化 342
13.1概述 342
13.2线程安全 343
13.2.1 Java语言中的线程安全 343
13.2.2线程安全的实现方法 348
13.3锁优化 356
13.3.1自旋锁与自适应自旋 356
13.3.2锁消除 357
13.3.3锁粗化 358
13.3.4轻量级锁 358
13.3.5偏向锁 361
13.4本章小结 362
附录A Java虚拟机家族 363
附录B 虚拟机字节码指令表 366
附录C HotSpot虚拟机主要参数表 372
附录D 对象查询语言(OQL)简介 376
附录E JDK历史版本轨迹 383