深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)
郑重声明:本文档仅限交流学习用,请勿商业用途
深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)
前言
第一部分 走近Java
第1章 走近Java
1.1 概述
1.2 Java技术体系
1.3 Java发展史
1.4 Java虚拟机发展史
1.4.1 Sun Classic Exact VM
1.4.2 Sun HotSpot VM
1.4.3 Sun Mobile-Embedded VM Meta-Circular VM
1.4.4 BEA JRockit IBM J9 VM
1.4.5 Azul VM BEA Liquid VM
1.4.6 Apache Harmony Google Android Dalvik VM
1.4.7 Microsoft JVM及其他
1.5 展望Java技术的未来
1.5.1 模块化
1.5.2 混合语言
1.5.3 多核并行
1.5.4 进一步丰富语法
1.5.5 64位虚拟机
1.6 实战:自己编译JDK
1.6.1 获取JDK源码
1.6.2 系统需求
1.6.3 构建编译环境
1.6.4 进行编译
1.6.5 在IDE工具中进行源码调试
1.7 本章小结
第二部分 自动内存管理机制
第2章 Java内存区域与内存溢出异常
2.1 概述
2.2 运行时数据区域
2.2.1 程序计数器
2.2.2 Java虚拟机栈
2.2.3 本地方法栈
2.2.4 Java堆
2.2.5 方法区
2.2.6 运行时常量池
2.2.7 直接内存
2.3 HotSpot虚拟机对象探秘
2.3.1 对象的创建
2.3.2 对象的内存布局
2.3.3 对象的访问定位
2.4 实战:OutOfMemoryError异常
2.4.1 Java堆溢出
2.4.2 虚拟机栈和本地方法栈溢出
2.4.3 方法区和运行时常量池溢出
2.4.4 本机直接内存溢出
2.5 本章小结
第3章 垃圾收集器与内存分配策略
3.1 概述
3.2 对象已死吗
3.2.1 引用计数算法
3.2.2 可达性分析算法
3.2.3 再谈引用
3.2.4 生存还是死亡
3.2.5 回收方法区
3.3 垃圾收集算法
3.3.1 标记-清除算法
3.3.2 复制算法
3.3.3 标记-整理算法
3.3.4 分代收集算法
3.4 HotSpot的算法实现
3.4.1 枚举根节点
3.4.2 安全点
3.4.3 安全区域
3.5 垃圾收集器
3.5.1 Serial收集器
3.5.2 ParNew收集器
3.5.3 Parallel Scavenge收集器
3.5.4 Serial Old收集器
3.5.5 Parallel Old收集器
3.5.6 CMS收集器
3.5.7 G1收集器
3.5.8 理解GC日志
3.5.9 垃圾收集器参数总结
3.6 内存分配与回收策略
3.6.1 对象优先在Eden分配
3.6.2 大对象直接进入老年代
3.6.3 长期存活的对象将进入老年代
3.6.4 动态对象年龄判定
3.6.5 空间分配担保
3.7 本章小结
第4章 虚拟机性能监控与故障处理工具
4.1 概述
4.2 JDK的命令行工具
4.2.1 jps:虚拟机进程状况工具
4.2.2 jstat:虚拟机统计信息监视工具
4.2.3 jinfo:Java配置信息工具
4.2.4 jmap:Java内存映像工具
4.2.5 jhat:虚拟机堆转储快照分析工具
4.2.6 jstack:Java堆栈跟踪工具
4.2.7 HSDIS:JIT生成代码反汇编
4.3 JDK的可视化工具
4.3.1 JConsole:Java监视与管理控制台
4.3.2 VisualVM:多合一故障处理工具
4.4 本章小结
第5章 调优案例分析与实战
5.1 概述
5.2 案例分析
5.2.1 高性能硬件上的程序部署策略
5.2.2 集群间同步导致的内存溢出
5.2.3 堆外内存导致的溢出错误
5.2.4 外部命令导致系统缓慢
5.2.5 服务器JVM进程崩溃
5.2.6 不恰当数据结构导致内存占用过大
5.2.7 由Windows虚拟内存导致的长时间停顿
5.3 实战:Eclipse运行速度调优
5.3.1 调优前的程序运行状态
5.3.2 升级JDK 1.6的性能变化及兼容问题
5.3.3 编译时间和类加载时间的优化
5.3.4 调整内存设置控制垃圾收集频率
5.3.5 选择收集器降低延迟
5.4 本章小结
第三部分 虚拟机执行子系统
第6章 类文件结构
6.1 概述
6.2 无关性的基石
6.3 Class类文件的结构
6.3.1 魔数与Class文件的版本
6.3.2 常量池
6.3.3 访问标志
6.3.4 类索引、父类索引与接口索引集合
6.3.5 字段表集合
6.3.6 方法表集合
6.3.7 属性表集合
6.4 字节码指令简介
6.4.1 字节码与数据类型
6.4.2 加载和存储指令
6.4.3 运算指令
6.4.4 类型转换指令
6.4.5 对象创建与访问指令
6.4.6 操作数栈管理指令
6.4.7 控制转移指令
6.4.8 方法调用和返回指令
6.4.9 异常处理指令
6.4.10 同步指令
6.5 公有设计和私有实现
6.6 Class文件结构的发展
6.7 本章小结
第7章 虚拟机类加载机制
7.1 概述
7.2 类加载的时机
7.3 类加载的过程
7.3.1 加载
7.3.2 验证
7.3.3 准备
7.3.4 解析
7.3.5 初始化
7.4 类加载器
7.4.1 类与类加载器
7.4.2 双亲委派模型
7.4.3 破坏双亲委派模型
7.5 本章小结
第8章 虚拟机字节码执行引擎
8.1 概述
8.2 运行时栈帧结构
8.2.1 局部变量表
8.2.2 操作数栈
8.2.3 动态连接
8.2.4 方法返回地址
8.2.5 附加信息
8.3 方法调用
8.3.1 解析
8.3.2 分派
8.3.3 动态类型语言支持
8.4 基于栈的字节码解释执行引擎
8.4.1 解释执行
8.4.2 基于栈的指令集与基于寄存器的指令集
8.4.3 基于栈的解释器执行过程
8.5 本章小结
第9章 类加载及执行子系统的案例与实战
9.1 概述
9.2 案例分析
9.2.1 Tomcat:正统的类加载器架构
9.2.2 OSGi:灵活的类加载器架构
9.2.3 字节码生成技术与动态代理的实现
9.2.4 Retrotranslator:跨越JDK版本
9.3 实战:自己动手实现远程执行功能
9.3.1 目标
9.3.2 思路
9.3.3 实现
9.3.4 验证
9.4 本章小结
第四部分 程序编译与代码优化
第10章 早期(编译期)优化
10.1 概述
10.2 Javac编译器
10.2.1 Javac的源码与调试
10.2.2 解析与填充符号表
10.2.3 注解处理器
10.2.4 语义分析与字节码生成
10.3 Java语法糖的味道
10.3.1 泛型与类型擦除
10.3.2 自动装箱、拆箱与遍历循环
10.3.3 条件编译
10.4 实战:插入式注解处理器
10.4.1 实战目标
10.4.2 代码实现
10.4.3 运行与测试
10.4.4 其他应用案例
10.5 本章小结
第11章 晚期(运行期)优化
11.1 概述
11.2 HotSpot虚拟机内的即时编译器
11.2.1 解释器与编译器
11.2.2 编译对象与触发条件
11.2.3 编译过程
11.2.4 查看及分析即时编译结果
11.3 编译优化技术
11.3.1 优化技术概览
11.3.2 公共子表达式消除
11.3.3 数组边界检查消除
11.3.4 方法内联
11.3.5 逃逸分析
11.4 Java与CC++的编译器对比
11.5 本章小结
第五部分 高效并发
第12章 Java内存模型与线程
12.1 概述
12.2 硬件的效率与一致性
12.3 Java内存模型
12.3.1 主内存与工作内存
12.3.2 内存间交互操作
12.3.3 对于volatile型变量的特殊规则
12.3.4 对于long和double型变量的特殊规则
12.3.5 原子性、可见性与有序性
12.3.6 先行发生原则
12.4 Java与线程
12.4.1 线程的实现
12.4.2 Java线程调度
12.4.3 状态转换
12.5 本章小结
第13章 线程安全与锁优化
13.1 概述
13.2 线程安全
13.2.1 Java语言中的线程安全
13.2.2 线程安全的实现方法
13.3 锁优化
13.3.1 自旋锁与自适应自旋
13.3.2 锁消除
13.3.3 锁粗化
13.3.4 轻量级锁
13.3.5 偏向锁
13.4 本章小结
附 录
附录A 编译Windows版的OpenJDK
附录B 虚拟机字节码指令表
附录C HotSpot虚拟机主要参数表
附录D 对象查询语言(OQL)简介
附录E JDK历史版本轨迹
Java性能优化权威指南
java性能优化权威指南目录:
第1章 策略、方法和方法论
1.1 性能问题的现状
1.2 性能分析的两种方法:自顶向下和自底向上
1.2.1 自顶向下
1.2.2 自底向上
1.3 选择正确的平台并评估系统性能
1.3.1 选择正确的CPU架构
1.3.2 评估系统性能
1.4 参考资料
第2章 操作系统性能监控
2.1 定义
2.2 CPU使用率
2.2.1 监控CPU使用率:Windows
2.2.2 监控CPU使用率:Windows typeperf
2.2.3 监控CPU使用率:Linux
2.2.4 监控CPU使用率:Solaris
2.2.5 命令行监控CPU使用率:Linux和Solaris
2.3 CPU调度程序运行队列
2.3.1 监控CPU调度程序运行队列:Windows
2.3.2 监控CPU调度程序运行队列:Solaris
2.3.3 监控CPU调度程序运行队列:Linux
2.4 内存使用率
2.4.1 监控内存利用率:Windows
2.4.2 监控内存使用率:Solaris
2.4.3 监控内存使用率:Linux
2.4.4 监控锁竞争:Solaris
2.4.5 监控锁竞争:Linux
2.4.6 监控锁竞争:Windows
2.4.7 隔离竞争锁
2.4.8 监控抢占式上下文切换
2.4.9 监控线程迁移
2.5 网络I/O使用率
2.5.1 监控网络I/O使用率:Solaris
2.5.2 监控网络I/O使用率:Linux
2.5.3 监控网络I/O使用率:Windows
2.5.4 应用性能改进的考虑
2.6 磁盘I/O使用率
2.7 其他命令行工具
2.8 监控CPU使用率:SPARC T系列系统
2.9 参考资料
第3章 JVM概览
3.1 HotSpot VM的基本架构
3.2 HotSpot VM运行时
3.2.1 命令行选项
3.2.2 VM生命周期
3.2.3 VM类加载
3.2.4 字节码验证
3.2.5 类数据共享
3.2.6 解释器
3.2.7 异常处理
3.2.8 同步
3.2.9 线程管理
3.2.10 C++堆管理
3.2.11 Java本地接口
3.2.12 VM致命错误处理
3.3 HotSpot VM垃圾收集器
3.3.1 分代垃圾收集
3.3.2 新生代
3.3.3 快速内存分配
3.3.4 垃圾收集器
3.3.5 Serial收集器
3.3.6 Parallel收集器:吞吐量为先!
3.3.7 Mostly-Concurrent收集器:低延迟为先!
3.3.8 Garbage-First收集器:CMS替代者
3.3.9 垃圾收集器比较
3.3.10 应用程序对垃圾收集器的影响
3.3.11 简单回顾收集器历史
3.4 HotSpot VM JIT编译器
3.4.1 类型继承关系分析
3.4.2 编译策略
3.4.3 逆优化
3.4.4 Client JIT编译器概览
3.4.5 Server JIT编译器概览
3.4.6 静态单赋值--程序依赖图
3.4.7 未来增强展望
3.5 HotSpot VM自适应调优
3.5.1 Java 1.4.2的默认值
3.5.2 Java 5自动优化的默认值
3.5.3 Java 6 Update 18更新后的默认优化值
3.5.4 自适应Java堆调整
3.5.5 超越自动优化
3.6 参考资料
第4章 JVM性能监控
4.1 定义
4.2 垃圾收集
4.2.1 重要的垃圾收集数据
4.2.2 垃圾收集报告
4.2.3 垃圾收集数据的离线分析
4.2.4 图形化工具
4.3 JIT编译器
4.4 类加载
4.5 Java应用监控
4.6 参考资料
Spring Cloud微服务实战 PDF
目录 · · · · · ·
第1章 基础知识 1
什么是微服务架构 1
-- 与单体系统的区别 1
-- 如何实施微服务 2
为什么选择Spring Cloud 6
Spring Cloud简介 7
版本说明 8
第2章 微服务构建:Spring Boot 11
框架简介 12
快速入门 13
-- 项目构建与解析 13
-- 实现RESTful API 17
配置详解 20
-- 配置文件 20
-- 自定义参数 22
-- 参数引用 22
-- 使用随机数 23
-- 命令行参数 23
-- 多环境配置 24
-- 加载顺序 25
监控与管理 26
-- 初识actuator 27
-- 原生端点 28
小结 38
第3章 服务治理:Spring Cloud Eureka 39
服务治理 39
-- Netflix Eureka 40
--搭建服务注册中心 41
--注册服务提供者 43
--高可用注册中心 46
--服务发现与消费 48
Eureka详解 51
--基础架构 52
--服务治理机制 52
--源码分析 56
配置详解 65
--服务注册类配置 65
--服务实例类配置 67
跨平台支持 71
第4章 客户端负载均衡:Spring Cloud Ribbon 73
客户端负载均衡 73
RestTemplate详解 75
-- GET请求 75
-- POST请求 77
-- PUT请求 79
-- DELETE请求 79
源码分析 80
-- 负载均衡器 91
-- 负载均衡策略 109
配置详解 123
--自动化配置 124
-- Camden版本对RibbonClient配置的优化 125
-- 参数配置 127
-- 与Eureka结合 127
重试机制 128
第5章 服务容错保护:Spring Cloud Hystrix 130
快速入门 131
原理分析 135
-- 工作流程 135
-- 断路器原理 144
-- 依赖隔离 148
使用详解 151
-- 创建请求命令 151
-- 定义服务降级 154
-- 异常处理 157
-- 命令名称、分组以及线程池划分 158
-- 请求缓存 159
-- 请求合并 166
属性详解 172
-- Command属性 174
-- collapser属性 184
-- threadPool属性 185
Hystrix仪表盘 187
Turbine集群监控 192
-- 构建监控聚合服务 192
-- 与消息代理结合 196
第6章 声明式服务调用:Spring Cloud Feign 199
快速入门 200
参数绑定 202
继承特性 205
Ribbon配置 209
全局配置 209
指定服务配置 209
重试机制 210
Hystrix配置 211
全局配置 211
禁用Hystrix 211
指定命令配置 212
服务降级配置 212
其他配置 214
第7章 API网关服务:Spring Cloud Zuul 217
快速入门 219
-- 构建网关 220
-- 请求路由 221
-- 请求过滤 223
路由详解 226
-- 传统路由配置 226
-- 服务路由配置 228
-- 服务路由的默认规则 229
-- 自定义路由映射规则 229
-- 路径匹配 230
-- 路由前缀 233
-- 本地跳转 234
-- Cookie与头信息 235
-- Hystrix和Ribbon支持 236
过滤器详解 238
-- 过滤器 238
-- 请求生命周期 239
-- 核心过滤器 240
-- 异常处理 244
-- 禁用过滤器 256
动态加载 257
-- 动态路由 257
-- 动态过滤器 261
第8章 分布式配置中心:Spring Cloud Config 267
快速入门 267
-- 构建配置中心 268
-- 配置规则详解 269
-- 客户端配置映射 272
服务端详解 274
-- 基础架构 274
-- Git配置仓库 276
-- SVN配置仓库 279
-- 本地仓库 279
-- 本地文件系统 279
-- 健康监测 280
-- 属性覆盖 281
-- 安全保护 281
-- 加密解密 282
-- 高可用配置 286
客户端详解 286
-- URI指定配置中心 287
-- 服务化配置中心 287
-- 失败快速响应与重试 290
-- 获取远程配置 292
-- 动态刷新配置 293
第9章 消息总线:Spring Cloud Bus 295
消息代理 295
RabbitMQ实现消息总线 296
-- 基本概念 297
-- 安装与使用 298
-- 快速入门 302
-- 整合Spring Cloud Bus 306
-- 原理分析 307
-- 指定刷新范围 308
-- 架构优化 309
-- RabbitMQ配置 310
Kafka实现消息总线 312
-- Kafka简介 312
-- 快速入门 313
--整合Spring Cloud Bus 315
-- Kafka配置 318
深入理解 318
-- 源码分析 320
-- 其他消息代理的支持 342
第10章 消息驱动的微服务:Spring Cloud Stream 344
快速入门 344
核心概念 349
-- 绑定器 350
-- 发布-订阅模式 351
-- 消费组 353
-- 消息分区 354
使用详解 355
-- 开启绑定功能 355
-- 绑定消息通道 356
-- 消息生产与消费 360
-- 响应式编程 366
-- 消费组与消息分区 368
-- 消息类型 370
绑定器详解 373
-- 绑定器SPI 373
-- 自动化配置 374
-- 多绑定器配置 374
-- RabbitMQ与Kafka绑定器 376
配置详解 376
-- 基础配置 377
-- 绑定通道配置 377
-- 绑定器配置 379
第11章 分布式服务跟踪:Spring Cloud Sleuth 386
快速入门 386
-- 准备工作 386
-- 实现跟踪 389
跟踪原理 390
抽样收集 392
与Logstash整合 394
与Zipkin整合 397
-- HTTP收集 398
-- 消息中间件收集 402
-- 收集原理 404
-- 数据存储 414
-- API接口 417
附录A Starter POMs 419
Netty权威指南 第2版
目录编辑
基础篇走进Java NIO
第1 章Java 的I/O 演进之路.2
1.1 I/O 基础入门...............3
1.1.1 Linux 网络I/O 模型简介.......3
1.1.2 I/O 多路复用技术.................6
1.2 Java 的I/O 演进..........8
1.3 总结............................ 10
第2 章NIO 入门.................... 11
2.1 传统的BIO 编程....... 11
2.1.1 BIO 通信模型图.................. 12
2.1.2 同步阻塞式I/O 创建的TimeServer 源码分析............. 13
2.1.3 同步阻塞式I/O 创建的TimeClient 源码分析.......... 16
2.2 伪异步I/O 编程........ 18
2.2.1 伪异步I/O 模型图.............. 19
2.2.2 伪异步I/O 创建的TimeServer 源码分析..... 19
2.2.3 伪异步I/O 弊端分析........... 21
2.3 NIO 编程.................... 24
2.3.1 NIO 类库简介.. 24
2.3.2 NIO 服务端序列图.............. 28
2.3.3 NIO 创建的TimeServer 源码分析................ 30
2.3.4 NIO 客户端序列图.............. 36
2.3.5 NIO 创建的TimeClient 源码分析................ 39
2.4 AIO 编程.................... 45
2.4.1 AIO 创建的TimeServer 源码分析................ 46
2.4.2 AIO 创建的TimeClient 源码分析................ 51
2.4.3 AIO 版本时间服务器运行结果.................... 56
2.5 4 种I/O 的对比......... 58
2.5.1 概念澄清.......... 58
2.5.2 不同I/O 模型对比.............. 59
2.6 选择Netty 的理由..... 60
2.6.1 不选择Java 原生NIO 编程的原因............... 61
2.6.2 为什么选择Netty ................ 62
2.7 总结............................ 63
入门篇 Netty NIO 开发指南
第3 章Netty 入门应用.......... 66
3.1 Netty 开发环境的搭建................ 66
3.1.1 下载Netty 的软件包........... 67
3.1.2 搭建Netty 应用工程........... 67
3.2 Netty 服务端开发...... 68
3.3 Netty 客户端开发...... 73
3.4 运行和调试................ 76
3.4.1 服务端和客户端的运行...... 76
3.4.2 打包和部署...... 77
3.5 总结............................ 77
第4 章TCP 粘包/拆包问题的解决之道...... 79
4.1 TCP 粘包/拆包.......... 79
4.1.1 TCP 粘包/拆包问题说明..... 80
4.1.2 TCP 粘包/拆包发生的原因....... 80
4.1.3 粘包问题的解决策略.......... 81
4.2 未考虑TCP 粘包导致功能异常案例................. 82
4.2.1 TimeServer 的改造.............. 82
4.2.2 TimeClient 的改造............... 83
4.2.3 运行结果.......... 84
4.3 利用LineBasedFrameDecoder 解决TCP 粘包问题................ 85
4.3.1 支持TCP 粘包的TimeServer ....................... 86
4.3.2 支持TCP 粘包的TimeClient........................ 88
4.3.3 运行支持TCP 粘包的时间服务器程序........ 90
4.3.4 LineBasedFrameDecoder 和StringDecoder 的原理分析........... 91
4.4 总结............................ 92
第5 章分隔符和定长解码器的应用...... 93
5.1 DelimiterBasedFrameDecoder 应用开发............. 94
5.1.1 DelimiterBasedFrameDecoder 服务端开发.... 94
5.1.2 DelimiterBasedFrameDecoder 客户端开发.... 97
5.1.3 运行DelimiterBasedFrameDecoder 服务端和客户端............... 99
5.2 FixedLengthFrameDecoder 应用开发............... 101
5.2.1 FixedLengthFrameDecoder 服务端开发...... 101
5.2.2 利用telnet 命令行测试EchoServer 服务端......103
5.3 总结.......................... 104
中级篇 Netty 编解码开发指南
第6 章编解码技术.............. 106
6.1 Java 序列化的缺点 ...... 107
6.1.1 无法跨语言.... 107
6.1.2 序列化后的码流太大........ 107
6.1.3 序列化性能太低................ 110
6.2 业界主流的编解码框架............ 113
6.2.1 Google 的Protobuf 介绍.... 113
6.2.2 Facebook 的Thrift 介绍.... 115
6.2.3 JBoss Marshalling 介绍..... 116
6.3 总结.......................... 117
第7 章MessagePack 编解码............... 118
7.1 MessagePack 介绍... 118
7.1.1 MessagePack 多语言支持.. 119
7.1.2 MessagePack Java API 介绍........................ 119
7.1.3 MessagePack 开发包下载. 120
7.2 MessagePack 编码器和解码器开发................. 120
7.2.1 MessagePack 编码器开发....... 120
7.2.2 MessagePack 解码器开发 ...... 121
7.2.3 功能测试........ 121
7.3 粘包/半包支持......... 124
7.4 总结.......................... 127
第8 章Google Protobuf 编解码.......... 128
8.1 Protobuf 的入门....... 129
8.1.1 Protobuf 开发环境搭建..... 129
8.1.2 Protobuf 编解码开发......... 131
8.1.3 运行Protobuf 例程............ 133
8.2 Netty 的Protobuf 服务端开发.. 133
8.2.1 Protobuf 版本的图书订购服务端开发........ 134
8.2.2 Protobuf 版本的图书订购客户端开发........ 136
8.2.3 Protobuf 版本的图书订购程序功能测试.... 139
8.3 Protobuf 的使用注意事项......... 140
8.4 总结.......................... 142
第9 章JBoss Marshalling 编解码....... 143
9.1 Marshalling 开发环境准备........ 143
9.2 Netty 的Marshalling 服务端开发..................... 144
9.3 Netty 的Marshalling 客户端开发..................... 147
9.4 运行Marshalling 客户端和服务端例程........... 149
9.5 总结.......................... 150
高级篇 Netty 多协议开发和应用
第10 章HTTP 协议开发应用............... 154
10.1 HTTP 协议介绍..... 155
10.1.1 HTTP 协议的URL .......... 155
10.1.2 HTTP 请求消息(HttpRequest).............. 155
10.1.3 HTTP 响应消息(HttpResponse)........... 158
10.2 Netty HTTP 服务端入门开发....... 159
10.2.1 HTTP 服务端例程场景描述..................... 160
10.2.2 HTTP 服务端开发........... 160
10.2.3 Netty HTTP 文件服务器例程运行结果.... 166
10.3 Netty HTTP+XML 协议栈开发....................... 170
10.3.1 开发场景介绍................. 171
10.3.2 HTTP+XML 协议栈设计.......174
10.3.3 高效的XML 绑定框架JiBx ..................... 175
10.3.4 HTTP+XML 编解码框架开发.................. 183
10.3.5 HTTP+XML 协议栈测试....... 199
10.3.6 小结............. 201
10.4 总结........................ 202
第11 章WebSocket 协议开发............. 203
11.1 HTTP 协议的弊端....... 204
11.2 WebSocket 入门..... 204
11.2.1 WebSocket 背景............... 205
11.2.2 WebSocket 连接建立....... 206
11.2.3 WebSocket 生命周期....... 207
11.2.4 WebSocket 连接关闭....... 208
11.3 Netty WebSocket 协议开发..... 209
11.3.1 WebSocket 服务端功能介绍..................... 209
11.3.2 WebSocket 服务端开发.... 210
11.3.3 运行WebSocket 服务端... 218
11.4 总结........................ 219
第12 章私有协议栈开发.... 221
12.1 私有协议介绍........ 221
12.2 Netty 协议栈功能设计............ 223
12.2.1 网络拓扑图.. 223
12.2.2 协议栈功能描述.............. 224
12.2.3 通信模型...... 224
12.2.4 消息定义...... 225
12.2.5 Netty 协议支持的字段类型...................... 226
12.2.6 Netty 协议的编解码规范. 227
12.2.7 链路的建立.. 229
12.2.8 链路的关闭.. 230
12.2.9 可靠性设计.. 230
12.2.10 安全性设计 232
12.2.11 可扩展性设计................ 232
12.3 Netty 协议栈开发.. 233
12.3.1 数据结构定义................. 233
12.3.2 消息编解码.. 237
12.3.3 握手和安全认证.............. 241
12.3.4 心跳检测机制................. 245
12.3.5 断连重连...... 248
12.3.6 客户端代码.. 249
12.3.7 服务端代码.. 251
12.4 运行协议栈............ 252
12.4.1 正常场景...... 252
12.4.2 异常场景:服务端宕机重启.................... 253
12.4.3 异常场景:客户端宕机重启.................... 256
12.5 总结........................ 256
第13 章服务端创建............ 258
13.1 原生NIO 类库的复杂性......... 259
13.2 Netty 服务端创建源码分析.... 259
13.2.1 Netty 服务端创建时序图. 260
13.2.2 Netty 服务端创建源码分析...................... 263
13.3 客户端接入源码分析.............. 272
13.4 总结........................ 275
第14 章客户端创建............ 276
14.1 Netty 客户端创建流程分析.... 276
14.2.1 Netty 客户端创建时序图. 276
14.2.2 Netty 客户端创建流程分析...................... 277
14.2 Netty 客户端创建源码分析.... 278
14.2.1 客户端连接辅助类Bootstrap.................... 278
14.2.2 客户端连接操作.............. 281
14.2.3 异步连接结果通知.......... 283
14.2.4 客户端连接超时机制...... 284
14.3 总结........................ 286
源码分析篇 Netty 功能介绍和源码分析
第15 章ByteBuf 和相关辅助类........... 288
15.1 ByteBuf 功能说明. 288
15.1.1 ByteBuf 的工作原理........ 289
15.1.2 ByteBuf 的功能介绍........ 294
15.2 ByteBuf 源码分析. 308
15.2.1 ByteBuf 的主要类继承关系..................... 309
15.2.2 AbstractByteBuf 源码分析........................ 310
15.2.3 AbstractReferenceCountedByteBuf 源码分析.................. 319
15.2.4 UnpooledHeapByteBuf 源码分析.............. 321
15.2.5 PooledByteBuf 内存池原理分析............... 326
15.2.6 PooledDirectByteBuf 源码分析................. 329
15.3 ByteBuf 相关的辅助类功能介绍.................... 332
15.3.1 ByteBufHolder................. 332
15.3.2 ByteBufAllocator ............. 333
15.3.3 CompositeByteBuf ........... 334
15.3.4 ByteBufUtil .. 336
15.4 总结........................ 337
第16 章Channel 和Unsafe ................. 338
16.1 Channel 功能说明. 338
16.1.1 Channel 的工作原理........ 339
16.1.2 Channel 的功能介绍........ 340
16.2 Channel 源码分析. 343
16.2.1 Channel 的主要继承关系类图.................. 343
16.2.2 AbstractChannel 源码分析........................ 344
16.2.3 AbstractNioChannel 源码分析.................. 347
16.2.4 AbstractNioByteChannel 源码分析........... 350
16.2.5 AbstractNioMessageChannel 源码分析..... 353
16.2.6 AbstractNioMessageServerChannel 源码分析.............. 354
16.2.7 NioServerSocketChannel 源码分析........... 355
16.2.8 NioSocketChannel 源码分析..................... 358
16.3 Unsafe 功能说明... 364
16.4 Unsafe 源码分析... 365
16.4.1 Unsafe 继承关系类图...... 365
16.4.2 AbstractUnsafe 源码分析. 366
16.4.3 AbstractNioUnsafe 源码分析.................... 375
16.4.4 NioByteUnsafe 源码分析. 379
16.5 总结........................ 387
第17 章ChannelPipeline 和ChannelHandler........... 388
17.1 ChannelPipeline 功能说明....... 389
17.1.1 ChannelPipeline 的事件处理.................... 389
17.1.2 自定义拦截器................. 391
17.1.3 构建pipeline 392
17.1.4 ChannelPipeline 的主要特性.................... 393
17.2 ChannelPipeline 源码分析....... 393
17.2.1 ChannelPipeline 的类继承关系图............. 393
17.2.2 ChannelPipeline 对ChannelHandler 的管理........... 393
17.2.3 ChannelPipeline 的inbound 事件.............. 396
17.2.4 ChannelPipeline 的outbound 事件............ 397
17.3 ChannelHandler 功能说明....... 398
17.3.1 ChannelHandlerAdapter 功能说明............ 399
17.3.2 ByteToMessageDecoder 功能说明............ 399
17.3.3 MessageToMessageDecoder 功能说明...... 400
17.3.4 LengthFieldBasedFrameDecoder 功能说明............... 400
17.3.5 MessageToByteEncoder 功能说明............. 404
17.3.6 MessageToMessageEncoder 功能说明....... 404
17.3.7 LengthFieldPrepender 功能说明............... 405
17.4 ChannelHandler 源码分析....... 406
17.4.1 ChannelHandler 的类继承关系图............. 406
17.4.2 ByteToMessageDecoder 源码分析............ 407
17.4.3 MessageToMessageDecoder 源码分析...... 410
17.4.4 LengthFieldBasedFrameDecoder 源码分析............ 411
17.4.5 MessageToByteEncoder 源码分析............. 415
17.4.6 MessageToMessageEncoder 源码分析....... 416
17.4.7 LengthFieldPrepender 源码分析............... 417
17.5 总结........................ 418
第18 章EventLoop 和EventLoopGroup.................... 419
18.1 Netty 的线程模型.. 419
18.1.1 Reactor 单线程模型......... 420
18.1.2 Reactor 多线程模型......... 421
18.1.3 主从Reactor 多线程模型 422
18.1.4 Netty 的线程模型............ 423
18.1.5 最佳实践...... 424
18.2 NioEventLoop 源码分析......... 425
18.2.1 NioEventLoop 设计原理.. 425
18.2.2 NioEventLoop 继承关系类图................... 426
18.2.3 NioEventLoop.................. 427
18.3 总结........................ 436
第19 章Future 和Promise .................. 438
19.1 Future 功能............ 438
19.2 ChannelFuture 源码分析......... 443
19.3 Promise 功能介绍. 445
19.4 Promise 源码分析. 447
19.4.1 Promise 继承关系图........ 447
19.4.2 DefaultPromise ................ 447
19.5 总结........................ 449
架构和行业应用篇 Netty 高级特性
第20 章Netty 架构剖析..... 452
20.1 Netty 逻辑架构...... 452
20.1.1 Reactor 通信调度层......... 453
20.1.2 职责链ChannelPipeline ... 453
20.1.3 业务逻辑编排层(Service ChannelHandler)........... 454
20.2 关键架构质量属性.................. 454
20.2.1 高性能.......... 454
20.2.2 可靠性.......... 457
20.2.3 可定制性...... 460
20.2.4 可扩展性...... 460
20.3 总结........................ 460
第21 章Java 多线程编程在Netty 中的应用............. 461
21.1 Java 内存模型与多线程编程.. 461
21.1.1 硬件的发展和多任务处理........................ 461
21.1.2 Java 内存模型................. 462
21.2 Netty 的并发编程实践............ 464
21.2.1 对共享的可变数据进行正确的同步......... 464
21.2.2 正确使用锁.. 465
21.2.3 volatile 的正确使用......... 467
21.2.4 CAS 指令和原子类......... 470
21.2.5 线程安全类的应用.......... 472
21.2.6 读写锁的应用................. 476
21.2.7 线程安全性文档说明...... 477
21.2.8 不要依赖线程优先级...... 478
21.3 总结........................ 479
第22 章高性能之道............ 480
22.1 RPC 调用性能模型分析.......... 480
22.1.1 传统RPC 调用性能差的三宗罪............... 480
22.1.2 I/O 通信性能三原则........ 481
22.2 Netty 高性能之道.. 482
22.2.1 异步非阻塞通信.............. 482
22.2.2 高效的Reactor 线程模型 482
22.2.3 无锁化的串行设计.......... 485
22.2.4 高效的并发编程.............. 486
22.2.5 高性能的序列化框架...... 486
22.2.6 零拷贝.......... 487
22.2.7 内存池.......... 491
22.2.8 灵活的TCP 参数配置能力....................... 494
22.3 主流NIO 框架性能对比......... 495
22.4 总结........................ 497
第23 章可靠性.................... 498
23.1 可靠性需求............ 498
23.1.1 宕机的代价.. 498
23.1.2 Netty 可靠性需求............ 499
23.2 Netty 高可靠性设计................ 500
23.2.1 网络通信类故障.............. 500
23.2.2 链路的有效性检测.......... 507
23.2.3 Reactor 线程的保护......... 510
23.2.4 内存保护...... 513
23.2.5 流量整形...... 516
23.2.6 优雅停机接口................. 519
23.3 优化建议................ 520
23.3.1 发送队列容量上限控制... 520
23.3.2 回推发送失败的消息...... 521
23.4 总结........................ 521
第24 章安全性.................... 522
24.1 严峻的安全形势.... 522
24.1.1 OpenSSL Heart bleed 漏洞.......... 522
24.1.2 安全漏洞的代价.............. 523
24.1.3 Netty 面临的安全风险..... 523
24.2 Netty SSL 安全特性................. 525
24.2.1 SSL 单向认证.................. 525
24.2.2 SSL 双向认证.................. 532
24.2.3 第三方CA 认证.............. 536
24.3 Netty SSL 源码分析................. 538
24.3.1 客户端.......... 538
24.3.2 服务端.......... 541
24.3.3 消息读取...... 544
24.3.4 消息发送...... 545
24.4 Netty 扩展的安全特性............ 546
24.4.1 IP 地址黑名单机制.......... 547
24.4.2 接入认证...... 548
24.4 总结........................ 550
第25 章Netty 未来展望..... 551
25.1 应用范围................ 551
25.2 技术演进................ 552
25.3 社区活跃度............ 552
25.4 Road Map ............... 552
25.5 总结........................ 553
附录A Netty 参数配置表.... 554 [1]
Hadoop权威指南中文(第四版)
第Ⅰ部分Hadoop基础知识
第1章初识Hadoop3
1.1数据!数据!3
1.2数据的存储与分析5
1.3查询所有数据6
1.4不仅仅是批处理7
1.5相较于其他系统的优势8
1.6ApacheHadoop发展简史12
1.7本书包含的内容16
第2章关于MapReduce19
2.1气象数据集19
2.2使用Unix工具来分析数据21
2.3使用Hadoop来分析数据22
2.4横向扩展31
2.5HadoopStreaming37
第3章Hadoop分布式文件系统42
3.1HDFS的设计42
3.2HDFS的概念44
3.3命令行接口50
3.4Hadoop文件系统52
3.5Java接口56
3.6数据流68
3.7通过distcp并行复制76
第4章关于YARN78
4.1剖析YARN应用运行机制79
4.2YARN与MapReduce1相比82
4.3YARN中的调度85
4.4延伸阅读95
第5章Hadoop的I/O操作96
5.1数据完整性96
5.2压缩99
5.3序列化109
5.4基于文件的数据结构127
第Ⅱ部分关于MapReduce
第6章MapReduce应用开发141
6.1用于配置的API142
6.2配置开发环境144
6.3用MRUnit来写单元测试152
6.4本地运行测试数据156
6.5在集群上运行160
6.6作业调优174
6.7MapReduce的工作流176
第7章MapReduce的工作机制184
7.1剖析MapReduce作业运行
机制184
7.2失败191
7.3shuffle和排序195
7.4任务的执行201
第8章MapReduce的
类型与格式207
8.1MapReduce的类型207
8.2输入格式218
8.3输出格式236
第9章MapReduce的特性243
9.1计数器243
9.2排序252
9.3连接264
9.4边数据分布270
9.5MapReduce库类276
第Ⅲ部分Hadoop的操作
第10章构建Hadoop集群279
10.1集群规范280
10.2集群的构建和安装284
10.3Hadoop配置288
10.4安全性305
10.5利用基准评测程序测试
Hadoop集群311
第11章管理Hadoop314
11.1HDFS314
11.2监控327
11.3维护329
第Ⅳ部分Hadoop相关开源项目
第12章关于Avro341
12.1Avro数据类型和模式342
12.2内存中的序列化和
反序列化特定API347
12.3Avro数据文件349
12.4互操作性351
12.5模式解析352
12.6排列顺序354
12.7关于AvroMapReduce356
12.8使用AvroMapReduce
进行排序359
12.9其他语言的Avro362
第13章关于Parquet363
13.1数据模型364
13.2Parquet文件格式367
13.3Parquet的配置368
13.4Parquet文件的读/写369
13.5ParquetMapReduce374
第14章关于Flume377
14.1安装Flume378
14.2示例378
14.3事务和可靠性380
14.4HDFSSink382
14.5扇出385
14.6通过代理层分发387
14.7Sink组391
14.8Flume与应用程序的集成395
14.9组件编目395
14.10延伸阅读397
第15章关于Sqoop398
15.1获取Sqoop398
15.2Sqoop连接器400
15.3一个导入的例子401
15.4生成代码404
15.5深入了解数据库导入405
15.6使用导入的数据409
15.7导入大对象412
15.8执行导出414
15.9深入了解导出功能416
15.10延伸阅读419
第16章关于Pig420
16.1安装与运行Pig421
16.2示例425
16.3与数据库进行比较428
16.4PigLatin429
16.5用户自定义函数446
16.6数据处理操作455
16.7Pig实战465
16.8延伸阅读468
第17章关于Hive469
17.1安装Hive470
17.2示例472
17.3运行Hive473
17.4Hive与传统数据库相比480
17.5HiveQL483
17.6表488
17.7查询数据501
17.8用户定义函数508
17.9延伸阅读516
第18章关于Crunch517
18.1示例518
18.2Crunch核心API521
18.3管线执行537
18.4Crunch库545
18.5延伸阅读547
第19章关于Spark548
19.1安装Spark549
19.2示例549
19.3弹性分布式数据集555
19.4共享变量564
19.5剖析Spark作业运行机制565
19.6执行器和集群管理器570
19.7延伸阅读574
第20章关于HBase575
20.1HBase基础575
20.2概念576
20.3安装581
20.4客户端584
20.5创建在线查询应用589
20.6HBase和RDBMS的比较598
20.7Praxis601
20.8延伸阅读602
第21章关于ZooKeeper604
21.1安装和运行ZooKeeper605
21.2示例607
21.3ZooKeeper服务615
21.4使用ZooKeeper来构建
应用629
21.5生产环境中的ZooKeeper640
21.6延伸阅读643
第Ⅴ部分案例学习
第22章医疗公司塞纳(Cerner)
的可聚合数据647
22.1从多CPU到语义集成647
22.2进入ApacheCrunch648
22.3建立全貌649
22.4集成健康医疗数据651
22.5框架之上的可组合性654
22.6下一步655
第23章生物数据科学:
用软件拯救生命657
23.1DNA的结构659
23.2遗传密码:将DNA字符
转译为蛋白质660
22.3将DNA想象成源代码661
23.4人类基因组计划和参考
基因组663
22.5DNA测序和比对664
23.6ADAM,一个可扩展的
基因组分析平台666
23.7使用Avro接口描述语言进行
自然语言编程666
23.8使用Parquet进行面向列的
存取668
23.9一个简单例子:用Spark和
ADAM做k-mer计数669
23.10从个性化广告到个性化
医疗672
23.11联系我们673
第24章开源项目Cascading674
24.1字段、元组和管道675
24.2操作678
24.3Taps,Schemes和Flows680
24.4Cascading实践应用681
24.5灵活性684
24.6ShareThis中的Hadoop和
Cascading685
24.7总结689
附录A安装ApacheHadoop691
附录B关于CDH697
附录C准备NCDC气象数据699
附录D新版和旧版Java
MapReduceAPI702