封面
版权信息
作者简介
内容简介
前言
引言篇
第1章 JVM与Java体系结构
1.1 为什么要学习JVM
1.2 Java及JVM的简介
1.2.1 Java:跨平台的语言
1.2.2 JVM:跨语言的平台
1.3 Java发展的重大事件
1.4 Open JDK和Oracle JDK
1.5 虚拟机与JVM
1.5.1 虚拟机
1.5.2 JVM
1.6 JVM的整体结构
1.7 Java代码执行流程
1.8 JVM的架构模型
1.9 JVM的生命周期
1.10 JVM的发展历程
1.10.1 Sun Classic VM
1.10.2 Exact VM
1.10.3 HotSpot VM
1.10.4 BEA的JRockit
1.10.5 IBM的J9
1.10.6 KVM和CDC/CLDC HotSpot
1.10.7 Azul VM
1.10.8 Liquid VM
1.10.9 Apache Harmony
1.10.10 Microsoft JVM
1.10.11 Taobao JVM
1.10.12 Dalvik VM/ART VM
1.10.13 Graal VM
1.10.14 其他JVM
1.11 本章小结
第1篇 运行时数据区篇
第2章 运行时数据区及线程概述
2.1 运行时数据区概述
2.2 线程
2.3 本章小结
第3章 程序计数器
3.1 程序计数器介绍
3.2 程序计数器举例说明
3.3 程序计数器常见问题
3.4 本章小结
第4章 虚拟机栈
4.1 虚拟机栈概述
4.2 栈的存储单位
4.3 局部变量表
4.3.1 局部变量表简介
4.3.2 Slot
4.4 操作数栈
4.5 栈顶缓存技术
4.6 动态链接
4.7 方法的调用
4.7.1 方法调用的分类
4.7.2 虚方法与非虚方法
4.7.3 关于invokedynamic指令
4.7.4 方法重写的本质
4.7.5 虚方法表
4.8 方法返回地址
4.9 本章小结
第5章 本地方法接口
5.1 本地方法接口概述
5.2 本章小结
第6章 本地方法栈
6.1 本地方法栈概述
6.2 本章小结
第7章 堆
7.1 堆的核心概述
7.1.1 JVM实例与堆内存的对应关系
7.1.2 堆与栈的关系
7.1.3 JVM堆空间划分
7.2 设置堆内存大小与内存溢出
7.2.1 设置堆内存大小
7.2.2 内存溢出案例
7.3 新生代与老年代
7.4 图解对象分配过程
7.5 Minor GC、Major GC、Full GC
7.5.1 GC的分类
7.5.2 分代式GC策略的触发条件
7.5.3 GC举例
7.6 堆空间分代思想
7.7 堆中对象的分配策略
7.8 为对象分配内存:TLAB
7.9 堆空间的参数设置小结
7.10 堆是否为分配对象存储的唯一选择
7.10.1 对象不一定存储在堆中
7.10.2 逃逸分析概述
7.10.3 逃逸分析优化结果
7.10.4 逃逸分析之栈上分配
7.10.5 逃逸分析之同步省略
7.10.6 逃逸分析之标量替换
7.10.7 逃逸分析小结:逃逸分析并不成熟
7.11 本章小结
第8章 方法区
8.1 栈、堆、方法区的交互关系
8.2 方法区的理解
8.2.1 方法区的官方描述
8.2.2 方法区的基本理解
8.2.3 JDK中方法区的变化
8.3 设置方法区大小与OOM
8.3.1 设置方法区内存的大小
8.3.2 方法区内存溢出
8.4 方法区的内部结构
8.4.1 类型信息、域信息和方法信息介绍
8.4.2 类变量和常量
8.4.3 常量池
8.4.4 运行时常量池
8.5 方法区使用举例
8.6 方法区的演进细节
8.6.1 HotSpot虚拟机中方法区的变化
8.6.2 永久代为什么被元空间替换
8.6.3 静态变量存放的位置
8.7 方法区的垃圾回收
8.8 本章小结
第9章 对象的实例化内存布局与访问定位
9.1 对象的实例化
9.1.1 创建对象的方式
9.1.2 创建对象的步骤
9.2 对象的内存布局
9.3 对象的访问定位
9.3.1 对象访问的定位方式
9.3.2 使用句柄访问
9.3.3 使用指针访问
9.4 本章小结
第10章 直接内存
10.1 直接内存概述
10.2 直接内存的优势
10.3 直接内存异常
10.4 申请直接内存源码分析
10.5 本章小结
第11章 执行引擎
11.1 概述
11.2 计算机语言的发展史
11.2.1 机器码
11.2.2 汇编语言
11.2.3 高级语言
11.2.4 字节码
11.3 Java代码编译和执行过程
11.4 解释器
11.5 JIT编译器
11.5.1 为什么HotSpot VM同时存在JIT编译器和解释器
11.5.2 热点代码探测确定何时JIT
11.5.3 设置执行模式
11.5.4 C1编译器和C2编译器
11.6 AOT编译器和Graal编译器
11.7 本章总结
第12章 字符串常量池
12.1 String的基本特性
12.1.1 String类概述
12.1.2 String的不可变性
12.2 字符串常量池
12.2.1 字符串常量池的大小
12.2.2 字符串常量池的位置
12.2.3 字符串常量对象的共享
12.3 字符串拼接操作
12.3.1 不同方式的字符串拼接
12.3.2 字符串拼接的细节
12.3.3 “+”拼接和StringBuilder拼接效率
12.4 intern()的使用
12.4.1 不同JDK版本的intern()方法
12.4.2 intern()方法的好处
12.5 字符串常量池的垃圾回收
12.6 G1中的String去重操作
12.7 本章小结
第2篇 垃圾收集篇
第13章 垃圾收集概述
13.1 什么是垃圾
13.2 为什么需要垃圾收集
13.3 如何进行垃圾收集
13.3.1 早期垃圾收集
13.3.2 Java垃圾收集机制
13.4 本章小结
第14章 垃圾收集相关算法
14.1 对象存活判断
14.1.1 引用计数算法
14.1.2 可达性分析算法
14.2 GC Roots集合
14.2.1 GC Roots
14.2.2 MAT追踪GC Roots的溯源
14.2.3 JProfiler追踪GC Roots的溯源
14.3 对象的finalization机制
14.4 清除垃圾对象
14.4.1 标记–清除算法
14.4.2 复制算法
14.4.3 标记–压缩算法
14.5 垃圾收集算法的复合与升级
14.5.1 分代收集算法
14.5.2 增量收集算法
14.5.3 分区收集算法
14.6 本章小结
第15章 垃圾收集相关概念
15.1 System.gc()的理解
15.2 内存溢出与内存泄漏
15.2.1 内存溢出
15.2.2 内存泄漏
15.3 Stop-The-World
15.4 安全点与安全区域
15.4.1 安全点
15.4.2 安全区域
15.5 四种引用
15.5.1 强引用——不回收
15.5.2 软引用——内存不足立即回收
15.5.3 弱引用——发现即回收
15.5.4 虚引用——对象回收跟踪
15.6 本章小结
第16章 垃圾收集器
16.1 垃圾收集器的发展和分类
16.1.1 评估垃圾收集器的性能指标
16.1.2 垃圾收集器的发展史
16.1.3 垃圾收集器的分类
16.1.4 查看默认的垃圾收集器
16.2 Serial收集器:串行回收
16.3 ParNew收集器:并行回收
16.4 Parallel Scaveng收集器:吞吐量优先
16.5 CMS收集器:低延迟
16.5.1 CMS收集器介绍
16.5.2 CMS的工作原理
16.5.3 CMS收集器的参数设置
16.5.4 JDK后续版本中CMS的变化
16.6 G1收集器:区域化分代式
16.6.1 G1收集器
16.6.2 G1收集器的特点和使用场景
16.6.3 分区Region:化整为零
16.6.4 G1收集器垃圾回收过程
16.6.5 G1收集器的参数设置
16.7 垃圾收集器的新发展
16.7.1 Epsilon和ZGC
16.7.2 Shenandoah GC
16.8 垃圾收集器总结
16.9 本章小结
第3篇 字节码与类的加载篇
第17章 class文件结构
17.1 概述
17.1.1 class文件的跨平台性
17.1.2 编译器分类
17.1.3 透过字节码指令看代码细节
17.2 虚拟机的基石:class文件
17.2.1 字节码指令
17.2.2 解读字节码方式
17.3 class文件结构
17.3.1 魔数:class文件的标识
17.3.2 class文件版本号
17.3.3 常量池:存放所有常量
17.3.4 访问标识
17.3.5 类索引、父类索引、接口索引集合
17.3.6 字段表集合
17.3.7 方法表集合
17.3.8 属性表集合
17.4 使用javap指令解析class文件
17.5 本章小结
第18章 字节码指令集与解析
18.1 概述
18.1.1 字节码与数据类型
18.1.2 指令分类
18.2 加载与存储指令
18.2.1 局部变量入栈指令
18.2.2 常量入栈指令
18.2.3 出栈装入局部变量表指令
18.3 算术指令
18.3.1 彻底理解i++与++i
18.3.2 比较指令
18.4 类型转换指令
18.4.1 宽化类型转换
18.4.2 窄化类型转换
18.5 对象、数组的创建与访问指令
18.5.1 创建指令
18.5.2 字段访问指令
18.5.3 数组操作指令
18.5.4 类型检查指令
18.6 方法调用与返回指令
18.6.1 方法调用指令
18.6.2 方法返回指令
18.7 操作数栈管理指令
18.8 控制转移指令
18.8.1 条件跳转指令
18.8.2 比较条件跳转指令
18.8.3 多条件分支跳转
18.8.4 无条件跳转
18.9 异常处理指令
18.9.1 抛出异常指令
18.9.2 异常处理和异常表
18.10 同步控制指令
18.10.1 方法内指定指令序列的同步
18.10.2 方法级的同步
18.11 本章小结
第19章 类的加载过程详解
19.1 概述
19.2 加载(Loading)阶段
19.2.1 加载完成的操作
19.2.2 二进制流的获取方式
19.2.3 类模型与Class实例的位置
19.2.4 数组类的加载
19.3 链接(Linking)阶段
19.3.1 链接阶段之验证(Verification)
19.3.2 链接阶段之准备(Preparation)
19.3.3 链接阶段之解析(Resolution)
19.4 初始化(Initialization)阶段
19.4.1 static与final搭配
19.4.2 <clinit>()方法的线程安全性
19.4.3 类的初始化时机:主动使用和被动使用
19.5 类的使用(Using)
19.6 类的卸载(Unloading)
19.7 本章小结
第20章 类加载器
20.1 概述
20.1.1 类加载的分类
20.1.2 类加载器的必要性
20.1.3 命名空间
20.1.4 类加载机制的基本特征
20.2 类加载器分类
20.2.1 引导类加载器
20.2.2 扩展类加载器
20.2.3 应用程序类加载器
20.2.4 自定义类加载器
20.3 获取不同的类加载器
20.4 类加载器源码解析
20.4.1 ClassLoader的主要方法
20.4.2 SecureClassLoader与URLClassLoader
20.4.3 ExtClassLoader与AppClassLoader
20.4.4 Class.forName()与ClassLoader.loadClass()
20.5 如何自定义类加载器
20.6 双亲委派模型
20.6.1 定义与本质
20.6.2 双亲委派模型的优势与劣势
20.6.3 破坏双亲委派模型
20.6.4 热替换的实现
20.7 沙箱安全机制
20.7.1 JDK 1.0时期
20.7.2 JDK 1.1时期
20.7.3 JDK 1.2时期
20.7.4 JDK 1.6时期
20.8 JDK 9新特性
20.9 本章小结
第4篇 性能监控与调优篇
第21章 命令行工具
21.1 概述
21.2 jps:查看正在运行的Java进程
21.3 jstat:查看JVM统计信息
21.4 jinfo:实时查看和修改JVM配置参数
21.5 jmap:导出内存映像文件和内存使用情况
21.6 jhat:JDK自带堆分析工具
21.7 jstack:打印JVM中线程快照
21.8 jcmd:多功能命令行
21.9 jstatd:远程主机信息收集
21.10 本章小结
第22章 JVM监控及诊断工具
22.1 概述
22.2 jconsole
22.3 VisualVM
22.3.1 插件安装
22.3.2 连接方式
22.3.3 主要功能
22.4 Eclipse MAT
22.4.1 获取堆dump文件
22.4.2 分析堆dump文件
22.4.3 支持使用OQL语言查询对象信息
22.4.4 Tomcat案例分析
22.5 JProfiler
22.5.1 概述
22.5.2 安装与配置
22.5.3 具体使用
22.5.4 案例分析
22.6 Arthas
22.6.1 基本概述
22.6.2 安装与使用
22.6.3 相关诊断命令
22.7 Java Mission Control
22.7.1 概述
22.7.2 安装使用
22.7.3 功能介绍
22.7.4 Java Flight Recorder介绍
22.8 其他工具
22.8.1 TProfiler
22.8.2 Java运行时追踪工具BTrace
22.9 本章小结
第23章 JVM运行时参数
23.1 JVM参数选项类型
23.1.1 标准参数选项
23.1.2 非标准参数选项
23.1.3 非稳定参数选项
23.2 添加JVM参数的方式
23.3 常用JVM参数选项
23.4 通过Java代码获取JVM参数
23.5 本章小结
第24章 GC日志分析
24.1 概述
24.2 生成GC日志
24.3 Parallel垃圾收集器日志解析
24.3.1 Minor GC
24.3.2 FULL GC
24.4 G1垃圾收集器日志解析
24.4.1 Minor GC
24.4.2 并发收集
24.4.3 混合收集
24.4.4 Full GC
24.5 CMS垃圾收集器日志解析
24.5.1 Minor GC
24.5.2 Major GC
24.5.3 浮动垃圾
24.6 日志解析工具
24.6.1 GCeasy
24.6.2 GCViewer
24.6.3 其他工具
24.7 根据日志信息解析堆空间数据分配
24.8 本章小结
第25章 OOM分类及解决方案
25.1 概述
25.2 OOM案例1:堆内存溢出
25.3 OOM案例2:元空间溢出
25.4 OOM案例3:GC overhead limit exceeded
25.5 OOM案例4:线程溢出
25.6 本章小结
第26章 性能优化案例
26.1 概述
26.2 性能测试工具:Apache JMeter
26.3 性能优化案例1:调整堆大小提高服务的吞吐量
26.4 性能优化案例2:调整垃圾收集器提高服务的吞吐量
26.5 性能优化案例3:JIT优化
26.6 性能优化案例4:G1并发执行的线程数对性能的影响
26.7 性能优化案例5:合理配置堆内存
26.8 性能优化案例6:CPU占用很高排查方案
26.9 性能优化案例7:日均百万级订单交易系统设置JVM参数
26.10 性能优化案例8:综合性能优化
26.11 本章小结
更新时间:2024-12-27 20:17:46