内 容 简 介本书细致分析了Java虚拟机开发的基本知识,为读者权衡出优化、高效和安全的最优方案。本书内容新颖、知识全面、讲解详细,全书共17章,第1章讲解一起走进Java世界的基本知识;第2章讲解JDK编译测试的基础知识;第3章讲解安全性考虑的核心知识;第4章讲解通过网络实现移动性的知识;第5章浅谈Java虚拟机内部机制的基础知识;第6章深入分析class文件的核心知识;第7章详细讲解栈和局部变量操作的知识;第8章深入详解内存异常和垃圾处理的基本知识;第9章讲解高效手段之性能监控工具和优化部署的核心知识;第10章讲解JVM参数分析和调优实战的知识;第11章讲解虚拟机类加载机制的基本知识;第12章讲解研究高效之魂;第13章讲解类加载器和执行子系统的基本知识;第14章讲解编译优化的基本知识;第15章讲解运行期优化的基本知识;第16章讲解内存模型和线程的基本知识;第17章讲解如何将安全和优化合二为一。全书内容循序渐进,并且逐一做到了深入剖析。本书适合Java各个级别的程序员、研发人员及在职程序员,也可以作为相关培训学校和大专院校相关专业的教学用书。前 言
自从Java语言自诞生以来,经过十多年的发展和应用,已经成为当今最流行的编程语言之一。根据某权威编程语言排行榜显示,它始终居于第一位。现在全球已有超过15亿部手机和手持设备应用Java技术。同时,Java技术因其跨平台特性和良好的可移植性,成为广大软件开发技术人员的挚爱,是全球程序员的首选开发平台之一。
日益成熟的Java语言编程技术现在已无处不在,使用该编程技术可以进行桌面程序应用、Web应用、分布式系统和嵌入式系统应用开发,并且在信息技术等各个领域得到广泛应用。
本书全面介绍了Java虚拟机技术的核心知识,全书内容深入并详解,作者用通俗的语言将大师级的知识展现在读者的眼前。
本书的内容
通过本书的内容,细致分析了Java虚拟机开发的基本知识,和读者们一起权衡出优化、高效和安全的最优方案。本书内容新颖、知识全面、讲解详细,全书分为17章,第1章讲解一起走进Java世界的基本知识;第2章讲解JDK编译测试的基础知识;第3章讲解安全性考虑的核心知识;第4章讲解通过网络实现移动性的知识;第5章浅谈Java虚拟机内部机制的基础知识;第6章深入分析class文件的核心知识;第7章详细讲解栈和局部变量操作的知识;第8章深入详解内存异常和垃圾处理的基本知识;第9章讲解高效手段之性能监控工具和优化部署的核心知识;第10章讲解JVM参数分析和调优实战的知识;第11章讲解虚拟机类加载机制的基本知识;第12章讲解研究高效之魂;第13章讲解类加载器和执行子系统的基本知识;第14章讲解编译优化的基本知识;第15章讲解运行期优化的基本知识;第16章讲解内存模型和线程的基本知识;第17章讲解如何将安全和优化合二为一。全书内容循序渐进,并且逐一做到了深入剖析。
本书特色
本书内容相当丰富,实例内容覆盖全面,满足Java程序员成长道路上的方方面面。我们的目标是通过一本图书,提供多本图书的价值,读者可以根据自己的需要有选择地阅读,以完善本人的知识和技能结构。在内容的编写上,本书具有以下特色。
(1) 专家写作,内容专业而深入
本书是国内一线著名的Java专家级作者的力作。为了本书确保广度和深度,本书并没有将大量篇幅用在规范和基本语法上,而是专注于各个基本知识的具体细节,尽量涉及了每个知识中最为重要的内容,并且讨论了相关的高级用法技术。
本书既是介绍性书籍,又是深入研究技术性书籍。本书实现了高级技术与介绍性知识并重的效果,为了达到这一目标,笔者做过大量研究。比如,参与论坛讨论,开发大量的实际项目,参加学术会议和研讨会,同时跟制定Java规范的专家组进行沟通,同全世界顶级专家进行合作。
(2) 结构合理
从用户的实际需要出发,科学安排知识结构,内容由浅入深,叙述清楚,具有很强的知识性和实用性,反映了Java虚拟机的核心知识。同时全书精心筛选的最具代表性、读者最关心典型知识点,几乎包括虚拟机技术的各个方面。
(3) 易学易懂
本书条理清晰、语言简洁,可帮助读者快速掌握每个知识点;每个部分既相互连贯又自成体系,使读者既可以按照本书编排的章节顺序进行学习,也可以根据自己的需求对某一章节进行针对性的学习。
(4) 由浅入深
本书从Java语言的发展、开发环境及基本语法知识入手,逐步介绍了JDK编译测试、安全性、移动性、虚拟机的内部机制、class文件、栈和局部变量操作、内存异常、垃圾处理、性能监控工具和优化部署、类的加载机制、类加载器和执行子系统、编译优化等知识。保证让读者在没有编程基础的情况下,也能够很快掌握Java虚拟机的各种技术。
(5) 实用性强
本书彻底摒弃枯燥的理论和简单的操作,注重实用性和可操作性,详细讲解了各个部分的源码知识,使用户掌握相关的操作技能的同时,还能学习到相应的基础知识。
读者对象
初学编程的自学者 编程爱好者
大中专院校的老师和学生 相关培训机构的老师和学员
毕业设计的学生 初中级程序开发人员
程序测试及维护人员 参加实习的初级级程序员
在职程序员 资深程序员
本团队在编写编写过程中,得到了清华大学出版社工作人员的大力支持。但是本团队水平毕竟有限,如有纰漏和不尽如人意之处在所难免,诚请读者提出意见或建议,以便修订并使之更臻完善。另外,为了方便读者学习,我们特开通了技术支持QQ群,群号为75593028,欢迎读者加入本群。
编 者目 录
第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推出JINI的背景 98
4.5.2 什么是JINI 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_Methodref_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
