JAVA虚拟机精讲-jvm(零)

0x00 缘起

上星期看了高翔龙的《JAVA虚拟机精讲》,知识点讲得还是挺全的,可以大概了解jvm的原理,而且作者写得显浅易懂,很适合像我这种jvm入门的小白。在书里有些小错误,但不影响阅读书里,还有贴的代码感觉不太到位,有一种想深入但戛然而止的感觉。总体上还是挺不错的。

打算开一个系列,写一下读书的过程,主要是按照书本的章节展开,内容也是书本的内容,然后如果有需要会进行相应的扩展。

0x01目录  · · · · · ·(from 豆瓣)

第1 章 Java体系结构 / 1
1.1 认识 Java / 1
1.1.1 与生俱来的优点 / 2
1.1.2 语法结构和对象模型 / 4
1.1.3 历史版本追溯 / 5
1.2 Java重要概念 / 7
1.3 安装与配置 Java 运行环境 / 10
1.4 Java技术的新特性 / 14
1.4.1 Java 模块化与 OSGi技术 / 14
1.4.2 语言无关性 / 15
1.4.3 使用Fork/Join 框架实现多核并行 / 16
1.4.4 丰富的语法特性 / 17
1.4.5 过渡到64 位虚拟机 / 18
1.5 实战:玩转 OpenJDK / 19
1.6 本章小结 / 36
第2 章 字节码的编译原理 / 37
2.1 javac 编译器简介 / 37
2.1.1 javac与Eclipse Compiler for Java 编译器 / 38
2.1.2 javac的使用与标准选项配置 / 39
2.1.3 编译原理 / 40
2.1.4 下载javac 编译器源码 / 41
2.1.5 调用compile() 方法执行编译 / 41
2.2 词法解析步骤 / 43
2.2.1 Token 序列 / 45
2.2.2 源码字符集合与 Token 之间 的对应关系 / 47
2.2.3 调用key()方法获取指定Token / 48
2.2.4 调用nextToken() 方法计算Token 的获取规则 / 48
2.2.5 调用parseCompilationUnit() 方法执行词法解 / 49
2.3 语法解析步骤 / 51
2.3.1 调用qualident()方法解析 package 语法节点 / 52
2.3.2 调用importDeclaration()
方法解析import 语法树 / 54
2.3.3 调用classDeclaration() 方法解析class 语法树 / 56
2.4 语义解析步骤 / 59
2.5 生成字节码 / 61
2.6 实战:使用 javap 工具分析字节码 / 62
2.7 实战:使用 GCJ 编译器将Java源码直接编译为本地机器指令 / 64
2.8 本章小结 / 66
第3 章 字节码文件 / 67
3.1 字节码文件的内部组成结构 / 67
3.2 符号引用 / 73
3.2.1 类或者接口的全限定名 / 74
3.2.2 简单名称 / 74
3.2.3 描述符 / 74
3.3 常量池 / 76
3.4 字段表 / 85
3.5 方法表 / 86
3.6 属性表 / 88
3.7 本章小结 / 96第4 章 剖析HotSpot 的Launcher / 97
4.1 HotSpot 的源码目录结构 / 97
4.2 Launcher简介 / 99
4.3 跟踪 Launcher 的执行过程 / 101
4.4 实战:在 Launcher 中添加 自定义函数模块 / 120
4.5 本章小结 / 121
第5 章 剖析HotSpot 的初始化过程 / 122
5.1 HotSpot 的构成模块 / 122
5.2 Prims 模块 / 124
5.2.1 JNI 子模块 / 124
5.2.2 JVM子模块 / 125
5.2.3 JVMTI 子模块 / 128
5.2.4 Perf 子模块 / 129
5.3 Runtime 模块 / 129
5.3.1 Thread 子模块 / 131
5.3.2 调用create_vm() 函数完成 HotSpot的最终初始化 / 131
5.4 跟踪 HotSpot的初始化过程 / 140
5.4.1 调用init() 和init_2()函数 初始化os 模块 / 141
5.4.2 调用vm_init_globals()函数 初始化全局数据结构 / 144
5.4.3 调用init_globals() 函数 初始化全局模块 / 144
5.5 本章小结 / 146
第6 章 内存分配与垃圾回收 / 147
6.1 JVM的运行时内存区结构 / 147
6.2 线程共享内存区 / 148
6.2.1 Java 堆区 / 148
6.2.2 方法区 / 150
6.2.3 运行时常量池 / 150
6.3 线程私有内存区 / 150
6.3.1 PC寄存器 / 151
6.3.2 Java 栈 / 151
6.3.3 本地方法栈 / 152
6.4 性能监控区 / 152
6.5 自动内存管理 / 152
6.5.1 内存分配原理 / 153
6.5.2 逃逸分析与栈上分配 / 157
6.5.3 对象内存布局与 OOP-Klass 模型 / 158
6.5.4 GC 的作用 / 159
6.5.5 垃圾标记:根搜索算法 / 160
6.5.6 垃圾回收:分代收集算法 / 161
6.6 垃圾收集器 / 164
6.6.1 串行回收:Serial 收集器 / 165
6.6.2 并行回收:ParNew收集器 / 166
6.6.3 程序吞吐量优先:Parallel 收集器 / 166
6.6.4 低延迟:CMS(Concurrent- Mark-Sweep)收集器 / 167
6.6.5 区域化分代式:G1(Garbage- First )收集器 / 170
6.6.6 垃圾收集的相关选项配置 / 172
6.7 实战:GC日志分析 / 175
6.7.1 不同GC日志的展示形式 / 175
6.7.2 使用GCHisto 工具分析离线 日志 / 179
6.8 实战:分析 dump 文件 / 181
6.8.1 使用jmap 工具生成dump 文件 / 181
6.8.2 使用MAT(Memory Analyzer Tool )工具分析 dump 文件 / 182
6.9 本章小结 / 184
第7 章 类加载机制 / 185
7.1 类加载器 / 185
7.1.1 抽象类ClassLoader / 187
7.1.2 双亲委派模型 / 188
7.1.3 自定义类加载器 / 191
7.1.4 定位ClassNotFoundException 异常 / 193
7.1.5 定位NoClassDefFoundError 异常 / 194
7.2 类的加载过程 / 195
7.2.1 加载字节码 / 198
7.2.2 验证阶段 / 199
7.2.3 准备阶段 / 200
7.2.4 解析阶段 / 201
7.2.5 初始化阶段 / 201
7.3 实战:字节码文件的加密与 解密 / 204
7.4 本章小结 / 208
第8 章 剖析HotSpot 的架构模型与 执行引擎 / 209
8.1 栈帧的组成结构 / 209
8.1.1 局部变量表 / 211
8.1.2 操作数栈 / 212
8.1.3 动态链接 / 214
8.1.4 方法返回值 / 216
8.2 HotSpot 中执行引擎的架构 模型 / 216
8.2.1 本地机器指令 / 217
8.2.2 寄存器架构与栈式架构之间 的区别 / 218
8.2.3 基于栈式架构的设计 / 221
8.2.4 调用call_stub()函数执行Java 方法 / 222
8.2.5 栈顶缓存(Top-of-Stack Cashing ) 技术 / 225
8.2.6 实战:跟踪字节码解释器的 执行步骤 / 227
8.3 解释器与 JIT 编译器 / 230
8.3.1 查阅HotSpot的运行时执 行模式 / 231
8.3.2 解释器的工作机制与构成模块 / 232
8.3.3 JIT 编译器的工作机制与构成模块 / 234
8.3.4 分层编译策略 / 235
8.3.5 热点探测功能 / 236
8.4 本章小结 / 239
附录A Java7新增语法特性 / 241
A.1 try-with-resources 语句 / 241
A.2 泛型的“<>”类型推断运算符 / 245
A.3 声明二进制字面值 / 247
A.4 字面值下画线支持 / 248
A.5 switch表达式支持 String 类型 / 250
A.6 mutil-catch特性 / 251
A.7 NIO2.0 文件系统的改变 / 255
附录B 指令助记符 / 262

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据