第1章 一起走进Java世界 1
1.1 Java的优势 2
1.1.1排名第一的编程语言 2
1.1.2提供给我们美好的就业前景 2
1.2学习Java需要了解的那些事 3
1.2.1品Java语言的发展历史 3
1.2.2 Java的特点 4
1.3剖析Java的运行机制 5
1.3.1高级语言的运行机制 5
1.3.2 Java的运行机制 5
1.3.3 Java虚拟机——JVM 7
1.3.4独特的垃圾回收机制 8
1.4剖析Java语言体系 9
1.4.1 Java程序员的6个级别 9
1.4.2分析Java体系的构成 11
1.5 Java虚拟机家族 12
1.5.1虚拟机的用途 12
1.5.2理解Java虚拟机 12
1.5.3 Java虚拟机的数据类型 13
1.5.4 Java虚拟机体系结构 14
1.5.5探索Java虚拟机家族成员的发展史 16
1.6 Java的最大优势——平台无关性 19
1.6.1平台无关性的好处 21
1.6.2 Java对平台无关性的支持 22
1.6.3分析影响Java平台无关性的因素 24
1.6.4实现平台无关性的策略 27
第2章 JDK编译测试 29
2.1为什么要编译JDK 30
2.2在Windows平台编译JDK 30
2.2.1为什么选择OpenJDK 30
2.2.2获取JDK源码 30
2.2.3系统需求 31
2.2.4构建编译环境 32
2.2.5准备依赖项 43
2.2.6开始编译 45
2.3在Linux平台编译JDK 47
第3章 安全性的考虑 53
3.1为什么需要安全性 54
3.2沙箱模型的4种组件 55
3.2.1沙箱模型介绍 55
3.2.2类加载体系结构 55
3.2.3 class文件检验器 60
3.2.4内置于Java虚拟机(及语言)的安全特性 64
3.2.5安全管理器和Java API 66
3.3浅谈安全管理器的必要性 68
3.3.1公正评论安全管理器优点和弱点 68
3.3.2方法check 69
3.4代码签名和认证 71
3.4.1代码签名和密钥 71
3.4.2代码签名示例 73
3.5策略机制和保护域 75
3.5.1分析Java的策略机制 76
3.5.2分析策略文件 77
3.5.3保护域 79
3.6访问控制器 79
3.6.1 implies()方法 80
3.6.2栈检查演示实例 82
第4章 通过网络实现移动性 85
4.1为什么需要网络移动性 86
4.2网络对软件的影响 87
4.2.1什么是网络 87
4.2.2计算机网络的发展历史 88
4.2.3网络应用形成了一种新的软件模式 88
4.3 Java体系对网络的支持 90
4.3.1对网络安全的支持 90
4.3.2网络移动性 95
4.4 applet演示 97
4.5 JINI服务对象 98
4.5.1 Java推出JIM的背景 98
4.5.2 什么是JIM 99
4.5.3为什么需要JINI 100
4.5.4 JINI的工作过程 101
4.5.5服务对象的优点 104
4.5.6 JINI技术的运作 106
4.5.7如何启动JINI 107
第5章 浅谈Java虚拟机的内部机制 111
5.1什么是虚拟机 112
5.1.1 JVM简介 112
5.1.2 JVM的组成部分 112
5.2 Java虚拟机的生命周期 113
5.3 Java虚拟机的体系结构 114
5.3.1数据类型 117
5.3.2“字” 119
5.3.3类装载器子系统 119
5.3.4方法区 121
5.3.5堆 125
5.3.6程序计数器 130
5.3.7 Java栈 130
5.3.8栈帧 130
5.3.9本地方法栈 134
5.3.10执行引擎 135
5.3.11本地方法接口 143
5.4 Java对象池技术的原理及其实现 144
5.4.1对象池技术的基本原理 145
5.4.2通用对象池的实现 146
5.4.3专用对象池的实现 148
第6章 详解Class文件 149
6.1 Class介绍 150
6.2 Java Class文件的格式 151
6.3常量池的具体结构 155
6.4特殊字符串 162
6.4.1全限定名 162
6.4.2简单名称 162
6.4.3描述符 162
6.5常量池 163
6.5.1 OCNSTANT Utf8 info表 163
6.5.2 CONSTANT Integer info表 165
6.5.3 CONSTANT Float info表 165
6.5.4 CONSTANT Long info表 165
6.5.5 CONSTANT Double info表 166
6.5.6 CONSTANT Class info表 166
6.5.7 CONSTANT String info表 167
6.5.8 CONSTANT Fieldref info表 167
6.5.9 CONSTANT Melhodref info表 168
6.5.10 CONSTANT InterfaceMethodref info表 168
6.5.11 CONSTANT NameAndType-info表 169
6.6字段 169
6.7方法 170
6.8属性 171
6.8.1属性格式 171
6.8.2 Code属性 172
6.8.3 ConstantValue属性 173
6.8.4 Deprecated属性 173
6.8.5 Exception属性 173
6.8.6 InnerClasses属性 174
6.9 JVM加载Class文件的原理 174
6.9.1 Java中的类文件 174
6.9.2 JVM加载Class文件 176
第7章 栈和局部变量操作 179
7.1类型装载、连接和初始化 180
7.1.1装载 181
7.1.2验证 182
7.1.3准备 184
7.1.4解析 184
7.1.5初始化 184
7.2对象的生命周期 185
7.3卸载类型 189
7.3.1卸载类型基础 189
7.3.2 unreachable状态的作用 189
7.3.3类型更新 193
7.4常量入栈操作 195
第8章 内存异常和垃圾处理 205
8.1 Java的内存分配管理 206
8.1.1内存分配中的栈和堆 206
8.1.2堆和栈的合作 209
8.2运行时的数据区域 213
8.2.1程序计数器(Program Counter Register) 213
8.2.2 Java的虚拟机栈VM Stack 214
8.2.3本地方法栈Native Method Stack 215
8.2.4 Java堆Java Heap 215
8.2.5方法区Method Area 216
8.2.6运行时常量池Runtime Constant Pool 217
8.2.7直接内存(Direct Memory) 217
8.3对象访问 218
8.3.1对象访问基础 218
8.3.2具体测试 220
8.4内存泄露 227
8.4.1内存泄露的分类 227
8.4.2内存泄露的定义 227
8.4.3内存泄露的常见问题和后果 228
8.4.4检测内存泄露 229
8.5垃圾收集初探 230
8.5.1何谓垃圾收集 230
8.5.2常见的垃圾收集策略 230
8.5.3 JVM的垃圾收集策略 232
8.6对象的生死 233
8.6.1引用计数算法(Reference Counting) 234
8.6.2根搜索算法 235
8.6.3再谈引用 236
8.6.4生存还是死亡 236
8.6.5回收方法区 238
8.7垃圾收集算法 239
8.7.1标记-清除算法 239
8.7.2复制算法 240
8.7.3标记-整理算法 241
8.7.4分代收集算法 241
8.8垃圾收集器 242
8.8.1 Serial收集器 243
8.8.2 ParNew收集器 243
8.8.3 Parallel Scavenge收集器 244
8.8.4 Serial Old收集器 245
8.8.5 Parallel Old收集器 245
8.8.6 CMS收集器 246
8.8.7 G1收集器 247
8.8.8垃圾收集器参数总结 248
8.9内存分配与回收策略 249
8.9.1对象优先在Eden分配 249
8.9.2大对象直接进入老年代 251
8.9.3长期存活的对象将进入老年代 252
8.9.4动态对象年龄判定 253
8.9.5空间分配担保 254
第9章 高效手段之性能监控工具和优化部署 257
9.1 JDK的命令行工具 258
9.1.1 jps:虚拟机进程状况工具 260
9.1.2 jstat:虚拟机统计信息监视工具 261
9.1.3 jinfo: Java配置信息工具 266
9.1.4 jmap: Java内存映像工具 266
9.1.5 jhat:虚拟机堆转储快照分析工具 267
9.1.6 jstack: Java堆栈跟踪工具 268
9.2 JDK的可视化工具 269
9.2.1 JConsole: Java监视与管理控制台 269
9.2.2 VisuaIVM:多合一故障处理工具 275
第10章 JVM参数分析和调优实战 279
10.1捕鱼工具选择——JVM参数 280
10.1.1通用的JVM参数 280
10.1.2串行收集器参数 282
10.1.3并行收集器参数 282
10.1.4并发收集器参数 283
10.2测试调优 284
10.2.1测试环境准备 284
10.2.2录制测试脚本 285
10.2.3定义测试场景 285
10.2.4执行初步性能测试 286
10.2.5选择调优方案 286
10.2.6调优后JVM监控图 288
10.2.7测试结果分析 292
10.3性能问题举例 292
10.3.1查看监控结果 292
10.3.2原因分析 295
10.4调优案例分析 296
10.4.1高性能硬件上的程序部署策略 296
10.4.2堆外内存导致的溢出错误 298
10.4.3外部命令导致系统缓慢 299
10.4.4服务器JVM进程崩溃 299
10.5 Eclipse调优 300
10.5.1 Eclipse快捷键 300
10.5.2启动运行速度调优 302
10.5.3调优前的程序运行状态 303
第11章 虚拟机类的加载机制 307
11.1虚拟机类的加载 308
11.2类的加载过程 311
11.2.1加载 311
11.2.2验证 312
11.2.3准备 315
11.2.4解析 315
11.2.5初始化 318
11.3类加载器 321
11.3.1类加载器的基础知识 321
11.3.2 JVM启动时的三个类加载器 327
11.3.3双亲委派模型 334
11.3.4破坏双亲委派模型 335
11.3.5开发自己的类加载器 337
11.3.6类加载器与Web容器 339
11.3.7类加载器与OSGi 339
第12章 研究高效之魂 341
12.1虚拟机的字节码 342
12.2栈帧的结构 343
12.2.1什么是栈帧 344
12.2.2局部变量表 345
12.2.3操作数栈 348
12.2.4动态连接 349
12.2.5方法返回地址 349
12.2.6 附加信息 350
12.3方法调用 350
12.3.1方法调用的背景 350
12.3.2解析 352
12.3.3分派 353
12.4基于栈的字节码解释执行引擎 360
12.4.1解释执行 360
12.4.2基于栈的指令集与基于寄存器的指令集 361
12.4.3基于栈的解释器执行过程 362
第13章 类加载器和执行子系统 365
13.1分析Tomcat类加载器的架构 366
13.1.1 Tomcat目录结构 366
13.1.2定义公共类加载器 368
13.1.3初始化catalina守护程序 369
13.1.4 Tomcat内部初始化类加载器 370
13.2 OSGi的类加载器架构 375
13.3字节码生成技术 377
13.4动态代理 378
13.4.1代理模式 378
13.4.2相关的类和接口 379
13.4.3代理机制及其特点 380
13.4.4应用动态代理 382
第14章 编译优化 393
14.1 Java的编译过程 394
14.2 Java编译优化简介 395
14.3 Javac编译器 397
14.3.1 Javac命令详解 397
14.3.2 Javac源码与调试 400
14.3.3解析与填充符号表 401
14.3.4注解处理器 402
14.3.5语义分析与字节码生成 402
14.3.6 Javac编译实例 405
14.3.7 Javac的源码与调试 406
14.4 Java语法糖的味道 407
14.4.1泛型与类型擦除 407
14.4.2自动装箱、拆箱与遍历循环 410
14.4.3条件编译 411
14.5插入式注解处理器 413
14.5.1插入式注解处理API基础 413
14.5.2实战 416
第15章 运行期优化 423
15.1运行期优化简介 424
15.2 HotSpot虚拟机内的即时编译器 424
15.2.1 HotSpot虚拟机的背景 424
15.2.2解释器与编译器 427
15.2.3编译对象与触发条件 428
15.2.4编译过程 430
15.2.5查看与分析即时编译结果 431
15.3编译优化技术 433
15.3.1优化技术概览 433
15.3.2公共子表达式消除 436
15.3.3数组边界检查消除 437
15.3.4方法内联 437
15.3.5逃逸分析 439
15.4 Java与C/C++的编译器对比 440
第16章 内存模型和线程 443
16.1 Java的多线程 444
16.2硬件的效率与一致性 445
16.3 Java内存模型 446
16.3.1 Java内存模型概述 446
16.3.2主内存与工作内存 449
16.3.3内存间交互操作 449
16.3.4 volatile型变量 451
16.3.5 long和double型变量 457
16.3.6原子性、可见性与有序性 458
16.3.7先行发生原则 459
16.4线程 460
16.4.1线程的实现 460
16.4.2线程调度 462
16.4.3线程状态间的转换 463
第17章 安全和优化合二为一 469
17.1线程安全 470
17.1.1 Java中的线程安全 470
17.1.2线程安全的实现方法 473
17.1.3无状态类 478
17.2锁优化 480
17.2.1自旋锁与自适应自旋 480
17.2.2锁消除 481
17.2.3锁膨胀 482
17.2.4轻量级锁 482
17.2.5偏向锁 484