hotspot实战-陈涛著pdf中文扫描免费版
分享到:
hotspot实战2014年3月由人民邮电出版社出版发行,是一本非常经典的hotspot方面书籍。据小编知Hotspot是一款高性能的Java虚拟机,可以大大提高Java运行的性能。Java原先是把源代码编译为字节码在虚拟机执行,这样整体执行效率不高。而Hotspot关注的是对部分热点代码的动态优化,将那些频繁执行的热点代码编译为本地原生代码,这样就显著地提高了性能。小编分享的这本HotSpot实战深入浅出地讲解了HotSpot虚拟机的工作原理,将隐藏在它内部的本质内容逐一呈现在读者面前,包括OpenJDK与HotSpot项目、编译和调试HotSpot的方法、HotSpot内核结构、Launcher、OOP-Klass对象表示系统、链接、运行时数据区、方法区、常量池和常量池Cache、Perf Data、Crash分析方法、转储分析方法、垃圾收集器的设计演进、CMS和G1收集器、栈、JVM对硬件寄存器的利用、栈顶缓存技术、解释器、字节码表、转发表、Stubs、Code Cache、Code生成器、JIT编译器、C1编译器、编译原理、JVM指令集实现、函数的分发机制、VTABLE和ITABLE、异常表、虚拟机监控工具(如jinfo、jstack、jhat、jmap等)的实现原理和开发方法、Attach机制、基于GUI的JVM分析工具(如MAT、VisualVM)等内容。想链接更多欢迎免费下载。HotSpot实战适合于已具有一定Java编程基础的读者,以及在Java或基于JVM的编程语言平台下进行各类软件开发的开发人员、测试人员和运维人员。对于JVM和编程语言爱好者来说,HotSpot实战也具有一定的学习参考价值。
小编温馨提醒:这本书的内容比较多,要注意劳逸结合哦
禁用于商业用途!如果您喜欢《hotspot实战》,请购买正版,谢谢合作。
爱学习,请到3322软件站查找资源自行下载!
1.1 JDK概述 2
1.1.1 JCP与JSR 3
1.1.2 JDK的发展历程 4
1.1.3 Java 7的语法变化 7
1.2 动手编译虚拟机 13
1.2.1 源代码下载 13
1.2.2 HotSpot源代码结构 13
1.2.3 搭建编译环境 15
1.2.4 编译目标 16
1.2.5 编译过程 17
1.2.6 编译常见问题 19
1.3 实战:在HotSpot内调试HelloWorld 20
1.3.1 认识GDB 21
1.3.2 准备调试脚本 22
1.4 小结 26
第2章 启动 28
2.1 HotSpot内核 28
2.1.1 如何阅读源代码 28
2.1.2 HotSpot内核框架 36
2.1.3 Prims 37
2.1.4 Services 39
2.1.5 Runtime 43
2.2 启动 46
2.2.1 Launcher 462.2.2 虚拟机生命周期 48
2.2.3 入口:main函数 50
2.2.4 主线程 51
2.2.5 InitializeJVM函数 53
2.2.6 JNI_CreateJavaVM函数 55
2.2.7 调用Java主方法 56
2.2.8 JVM退出路径 56
2.3 系统初始化 57
2.3.1 配置OS模块 58
2.3.2 配置系统属性 60
2.3.3 加载系统库 61
2.3.4 启动线程 62
2.3.5 vm_init_globals函数:初始化全局数据结构 65
2.3.6 init_globals函数:初始化全局模块 65
2.4 小结 69
第3章 类与对象 70
3.1 对象表示机制 71
3.1.1 OOP-Klass二分模型 71
3.1.2 Oops模块 71
3.1.3 OOP框架与对象访问机制 73
3.1.4 Klass与instanceKlass 79
3.1.5 实战:用HSDB调试HotSpot 82
3.2 类的状态转换 87
3.2.1 入口:Class文件 87
3.2.2 类的状态 92
3.2.3 加载 96
3.2.4 链接 101
3.2.5 初始化 104
3.2.6 实战:类的“族谱” 107
3.2.7 实战:系统字典 111
3.3 创建对象 113
3.3.1 实例对象的创建流程 114
3.3.2 实战:探测JVM内部对象 116
3.4 小结 119
第4章 运行时数据区 120
4.1 堆 121
4.1.1 Java的自动内存管理 121
4.1.2 堆的管理 122
4.2 线程私有区域 125
4.2.1 PC 125
4.2.2 JVM栈 126
4.3 方法区 126
4.3.1 纽带作用 127
4.3.2 常量池 130
4.3.3 常量池缓存:ConstantPoolCache 133
4.3.4 方法的表示:methodOop 134
4.3.5 方法的解析:将符号引用转换成直接引用 138
4.3.6 代码放在哪里:ConstMethodOop 141
4.3.7 实战:探测运行时常量池 142
4.4 性能监控数据区:Perf Data 147
4.4.1 描述这段空间:PerfMemory 147
4.4.2 查看 148
4.4.3 生产 150
4.5 转储 151
4.5.1 用VisualVM进行转储分析 151
4.5.2 JVM Crash 153
4.6 小结 158
第5章 垃圾收集 159
5.1 堆与GC 160
5.1.1 垃圾收集 160
5.1.2 分代收集 162
5.1.3 快速分配 165
5.1.4 栈上分配和逸出分析 167
5.1.5 GC公共模块 167
5.2 垃圾收集器 170
5.2.1 设计演进 170
5.2.2 CMS收集器 175
5.2.3 G1收集器 180
5.3 实战:性能分析方法 184
5.3.1 获取GC日志 184
5.3.2 GC监控信息 187
5.3.3 内存分析工具 189
5.3.4 选择合适的收集器与GC性能评估 190
5.3.5 不要忽略JVM Crash日志 195
5.4 小结 196
第6章 栈 197
6.1 硬件背景:了解真实机器 198
6.1.1 程序是如何运行的 198
6.1.2 x86与栈帧 199
6.1.3 ARM对Java硬件级加速:Jazelle技术 202
6.2 Java栈 203
6.2.1 寄存器式指令集与栈式指令集 203
6.2.2 HotSpot中的栈 204
6.2.3 栈帧 207
6.2.4 充分利用寄存器资源 210
6.2.5 虚拟机如何调用Java函数 212
6.2.6 优化:栈顶缓存 221
6.2.7 实战:操作数栈 223
6.3 小结 228
第7章 解释器和即时编译器 229
7.1 概述 230
7.2 解释器如何工作 231
7.2.1 Interpreter模块 232
7.2.2 Code模块 234
7.2.3 字节码表 235
7.2.4 Code Cache 236
7.2.5 InterpreterCodelet与Stub队列 239
7.2.6 Code生成器 241
7.2.7 模板表与转发表 244
7.2.8 实战:InterpreterCodelet 247
7.3 即时编译器 250
7.3.1 概述 250
7.3.2 编译器模块 251
7.3.3 编译器的基本结构 252
7.3.4 实战:编译原理实践,了解编译中间环节 255
7.4 小结 267
第8章 指令集 268
8.1 再说栈式指令集 268
8.2 数据传送 270
8.2.1 局部变量、常量池和操作数栈之间的数据传送 270
8.2.2 数据传送指令 272
8.2.3 实战:数组的越界检查 277
8.3 类型转换 279
8.4 对象的创建和操作 281
8.5 程序流程控制 282
8.5.1 控制转移指令 282
8.5.2 条件转移 283
8.5.3 无条件转移 284
8.5.4 复合条件转移 285
8.5.5 实战:switch语句如何使用String 287
8.6 运算 290
8.6.1 加法:iadd 290
8.6.2 取负:ineg 291
8.7 函数的调用和返回 292
8.7.1 Java函数分发机制:VTABLE与ITABLE 293
8.7.2 invoke系列指令 297
8.7.3 动态分发:覆盖 299
8.7.4 静态分发:重载 302
8.8 异常 305
8.8.1 异常表 305
8.8.2 创建异常 306
8.8.3 try-catch 309
8.8.4 finally 311
8.9 小结 312
第9章 虚拟机监控工具 313
9.1 Attach机制 314
9.1.1 AttachProvider与VirtualMachine 314
9.1.2 命令的下发:execute() 317
9.1.3 命令的执行:Attach Listener守护线程 319
9.2 查看JVM进程 320
9.2.1 用jps查看Java进程 320
9.2.2 实战:定制jps,允许查看库路径 323
9.3 查看和配置JVM 326
9.3.1 用jinfo查看JVM参数配置 326
9.3.2 实战:扩展flags选项,允许查看命令行参数 330
9.4 堆内存转储工具 332
9.4.1 Heap Dump 332
9.4.2 原理 333
9.5 堆转储分析 337
9.5.1 Heap Dump分析工具:jhat 337
9.5.2 实战:MAT分析过程 340
9.6 线程转储分析 343
9.6.1 jstack 343
9.6.2 实战:如何分析资源等待 344
9.7 小结 347
3.3.1 实例对象的创建流程
实例的创建过程,首先根据从类常量池中获取对象类型信息并验证类是否已被解析过,若确保该类已被加载和正确解析,使用快速分配(fast allocation)技术为该类分配对象空问;若该类尚未解析过,则只能通过慢速分配(slow allocation)方式分配实例对象。实例的创建流程如图3—30所示。
对象的创建基本流程如下所示。
(1)验证类已被解析。
(2)获取instanceKlass,确保klass已完全初始化。
(3)若满足快速分配条件,则进入快速分配流程。
(4)若不满足快速分配条件,或者快速分配失败,则进入慢速分配流程。
接下来,我们来看一下快速分配与慢速分配的区别和使用场景。
1.快速分配
如果在实例分配之前已经完成了类型的解析,那么分配操作仅仅是在内存空间中划分可用内存,因此能以较高效效率实现内存分配,故称为快速分配。
根据分配空间是来自于线程私有区域还是共享的堆空间,快速分配又可以分为两种空间选择策略。
HotSpot通过线程局部分配缓存技术(即Thread.Local Allocation Buffers,简称TLABs)可以在线程私有区域实现空间的分配。
注意可以通过VM选项UseTLAB来开启或关闭TLAB功能。
根据是否使用TLAB,快速分配方式有两种选择策略。
选择TLAB:首先尝试在TLAB中分配,因为TLAB是线程私有区域,故不需要加锁便能够保证线程安全。在分配一个新的对象空间时,将首先尝试在TLAB空间中分配对象空间,若分配空间的请求失败,则再尝试使用加锁机制在Eden区分配对象。
选择Eden空间:若失败,则尝试在共享的Eden区进行分配,Eden区是所有线程共享区域,需要保证线程安全,故采用原子操作进行分配。若分配失败,则再次尝试该操作,直到分配成功为止。
......
1、下载并解压,得出pdf文件
2、如果打不开本文件,请务必在3322软件站选择一款阅读器下载
3、安装后,在打开解压得出的pdf文件
4、双击进行阅读
方法二:
1、在手机里下载3322软件站中的阅读器和百度网盘
2、直接将pdf传输到百度网盘
3、用阅读器打开即可阅读
小编温馨提醒:这本书的内容比较多,要注意劳逸结合哦
免责声明:
来源于网络,仅用于分享知识,学习和交流!请下载完在24小时内删除。禁用于商业用途!如果您喜欢《hotspot实战》,请购买正版,谢谢合作。
爱学习,请到3322软件站查找资源自行下载!
作者介绍:
陈涛,硕士,毕业于中国科技大学。现就职于网易公司旗下的网易宝,从事在线支付系统的设计与开发工作。在从事Java工作之前,曾有过Linux内核及驱动开发工作经验。热衷于专研技术,对编程语言和JVM比较感兴趣。工作之余,喜欢足球和武侠带来的乐趣。目前正在“专研”的课题是如何做一名称职的奶爸。目录:
第1章 初识HotSpot 11.1 JDK概述 2
1.1.1 JCP与JSR 3
1.1.2 JDK的发展历程 4
1.1.3 Java 7的语法变化 7
1.2 动手编译虚拟机 13
1.2.1 源代码下载 13
1.2.2 HotSpot源代码结构 13
1.2.3 搭建编译环境 15
1.2.4 编译目标 16
1.2.5 编译过程 17
1.2.6 编译常见问题 19
1.3 实战:在HotSpot内调试HelloWorld 20
1.3.1 认识GDB 21
1.3.2 准备调试脚本 22
1.4 小结 26
第2章 启动 28
2.1 HotSpot内核 28
2.1.1 如何阅读源代码 28
2.1.2 HotSpot内核框架 36
2.1.3 Prims 37
2.1.4 Services 39
2.1.5 Runtime 43
2.2 启动 46
2.2.1 Launcher 462.2.2 虚拟机生命周期 48
2.2.3 入口:main函数 50
2.2.4 主线程 51
2.2.5 InitializeJVM函数 53
2.2.6 JNI_CreateJavaVM函数 55
2.2.7 调用Java主方法 56
2.2.8 JVM退出路径 56
2.3 系统初始化 57
2.3.1 配置OS模块 58
2.3.2 配置系统属性 60
2.3.3 加载系统库 61
2.3.4 启动线程 62
2.3.5 vm_init_globals函数:初始化全局数据结构 65
2.3.6 init_globals函数:初始化全局模块 65
2.4 小结 69
第3章 类与对象 70
3.1 对象表示机制 71
3.1.1 OOP-Klass二分模型 71
3.1.2 Oops模块 71
3.1.3 OOP框架与对象访问机制 73
3.1.4 Klass与instanceKlass 79
3.1.5 实战:用HSDB调试HotSpot 82
3.2 类的状态转换 87
3.2.1 入口:Class文件 87
3.2.2 类的状态 92
3.2.3 加载 96
3.2.4 链接 101
3.2.5 初始化 104
3.2.6 实战:类的“族谱” 107
3.2.7 实战:系统字典 111
3.3 创建对象 113
3.3.1 实例对象的创建流程 114
3.3.2 实战:探测JVM内部对象 116
3.4 小结 119
第4章 运行时数据区 120
4.1 堆 121
4.1.1 Java的自动内存管理 121
4.1.2 堆的管理 122
4.2 线程私有区域 125
4.2.1 PC 125
4.2.2 JVM栈 126
4.3 方法区 126
4.3.1 纽带作用 127
4.3.2 常量池 130
4.3.3 常量池缓存:ConstantPoolCache 133
4.3.4 方法的表示:methodOop 134
4.3.5 方法的解析:将符号引用转换成直接引用 138
4.3.6 代码放在哪里:ConstMethodOop 141
4.3.7 实战:探测运行时常量池 142
4.4 性能监控数据区:Perf Data 147
4.4.1 描述这段空间:PerfMemory 147
4.4.2 查看 148
4.4.3 生产 150
4.5 转储 151
4.5.1 用VisualVM进行转储分析 151
4.5.2 JVM Crash 153
4.6 小结 158
第5章 垃圾收集 159
5.1 堆与GC 160
5.1.1 垃圾收集 160
5.1.2 分代收集 162
5.1.3 快速分配 165
5.1.4 栈上分配和逸出分析 167
5.1.5 GC公共模块 167
5.2 垃圾收集器 170
5.2.1 设计演进 170
5.2.2 CMS收集器 175
5.2.3 G1收集器 180
5.3 实战:性能分析方法 184
5.3.1 获取GC日志 184
5.3.2 GC监控信息 187
5.3.3 内存分析工具 189
5.3.4 选择合适的收集器与GC性能评估 190
5.3.5 不要忽略JVM Crash日志 195
5.4 小结 196
第6章 栈 197
6.1 硬件背景:了解真实机器 198
6.1.1 程序是如何运行的 198
6.1.2 x86与栈帧 199
6.1.3 ARM对Java硬件级加速:Jazelle技术 202
6.2 Java栈 203
6.2.1 寄存器式指令集与栈式指令集 203
6.2.2 HotSpot中的栈 204
6.2.3 栈帧 207
6.2.4 充分利用寄存器资源 210
6.2.5 虚拟机如何调用Java函数 212
6.2.6 优化:栈顶缓存 221
6.2.7 实战:操作数栈 223
6.3 小结 228
第7章 解释器和即时编译器 229
7.1 概述 230
7.2 解释器如何工作 231
7.2.1 Interpreter模块 232
7.2.2 Code模块 234
7.2.3 字节码表 235
7.2.4 Code Cache 236
7.2.5 InterpreterCodelet与Stub队列 239
7.2.6 Code生成器 241
7.2.7 模板表与转发表 244
7.2.8 实战:InterpreterCodelet 247
7.3 即时编译器 250
7.3.1 概述 250
7.3.2 编译器模块 251
7.3.3 编译器的基本结构 252
7.3.4 实战:编译原理实践,了解编译中间环节 255
7.4 小结 267
第8章 指令集 268
8.1 再说栈式指令集 268
8.2 数据传送 270
8.2.1 局部变量、常量池和操作数栈之间的数据传送 270
8.2.2 数据传送指令 272
8.2.3 实战:数组的越界检查 277
8.3 类型转换 279
8.4 对象的创建和操作 281
8.5 程序流程控制 282
8.5.1 控制转移指令 282
8.5.2 条件转移 283
8.5.3 无条件转移 284
8.5.4 复合条件转移 285
8.5.5 实战:switch语句如何使用String 287
8.6 运算 290
8.6.1 加法:iadd 290
8.6.2 取负:ineg 291
8.7 函数的调用和返回 292
8.7.1 Java函数分发机制:VTABLE与ITABLE 293
8.7.2 invoke系列指令 297
8.7.3 动态分发:覆盖 299
8.7.4 静态分发:重载 302
8.8 异常 305
8.8.1 异常表 305
8.8.2 创建异常 306
8.8.3 try-catch 309
8.8.4 finally 311
8.9 小结 312
第9章 虚拟机监控工具 313
9.1 Attach机制 314
9.1.1 AttachProvider与VirtualMachine 314
9.1.2 命令的下发:execute() 317
9.1.3 命令的执行:Attach Listener守护线程 319
9.2 查看JVM进程 320
9.2.1 用jps查看Java进程 320
9.2.2 实战:定制jps,允许查看库路径 323
9.3 查看和配置JVM 326
9.3.1 用jinfo查看JVM参数配置 326
9.3.2 实战:扩展flags选项,允许查看命令行参数 330
9.4 堆内存转储工具 332
9.4.1 Heap Dump 332
9.4.2 原理 333
9.5 堆转储分析 337
9.5.1 Heap Dump分析工具:jhat 337
9.5.2 实战:MAT分析过程 340
9.6 线程转储分析 343
9.6.1 jstack 343
9.6.2 实战:如何分析资源等待 344
9.7 小结 347
精彩书摘:
......3.3.1 实例对象的创建流程
实例的创建过程,首先根据从类常量池中获取对象类型信息并验证类是否已被解析过,若确保该类已被加载和正确解析,使用快速分配(fast allocation)技术为该类分配对象空问;若该类尚未解析过,则只能通过慢速分配(slow allocation)方式分配实例对象。实例的创建流程如图3—30所示。
对象的创建基本流程如下所示。
(1)验证类已被解析。
(2)获取instanceKlass,确保klass已完全初始化。
(3)若满足快速分配条件,则进入快速分配流程。
(4)若不满足快速分配条件,或者快速分配失败,则进入慢速分配流程。
接下来,我们来看一下快速分配与慢速分配的区别和使用场景。
1.快速分配
如果在实例分配之前已经完成了类型的解析,那么分配操作仅仅是在内存空间中划分可用内存,因此能以较高效效率实现内存分配,故称为快速分配。
根据分配空间是来自于线程私有区域还是共享的堆空间,快速分配又可以分为两种空间选择策略。
HotSpot通过线程局部分配缓存技术(即Thread.Local Allocation Buffers,简称TLABs)可以在线程私有区域实现空间的分配。
注意可以通过VM选项UseTLAB来开启或关闭TLAB功能。
根据是否使用TLAB,快速分配方式有两种选择策略。
选择TLAB:首先尝试在TLAB中分配,因为TLAB是线程私有区域,故不需要加锁便能够保证线程安全。在分配一个新的对象空间时,将首先尝试在TLAB空间中分配对象空间,若分配空间的请求失败,则再尝试使用加锁机制在Eden区分配对象。
选择Eden空间:若失败,则尝试在共享的Eden区进行分配,Eden区是所有线程共享区域,需要保证线程安全,故采用原子操作进行分配。若分配失败,则再次尝试该操作,直到分配成功为止。
......
使用说明:
方法一:1、下载并解压,得出pdf文件
2、如果打不开本文件,请务必在3322软件站选择一款阅读器下载
3、安装后,在打开解压得出的pdf文件
4、双击进行阅读
方法二:
1、在手机里下载3322软件站中的阅读器和百度网盘
2、直接将pdf传输到百度网盘
3、用阅读器打开即可阅读
展开更多
hotspot实战-陈涛著pdf中文扫描免费版下载地址
- 需先下载高速下载器:
- 专用下载:
- 其它下载: