《Java虚拟机字节码从入门到实战》简介
《Java虚拟机字节码从入门到实战》这本书是由吴就业创作的,《Java虚拟机字节码从入门到实战》共有70章节
1
版权信息
Java虚拟机字节码从入门到实战 DNA-BN:ECFD-N00020655-20200810 出版:浙江出版集团数字传媒有限公司 浙江 杭州 体育场路347号...
2
目录
...
3
序言
为什么写这本书 笔者在学习Java虚拟机字节码的过程中遇到过很多问题,也曾浪费不少时间去查阅资料,在学习ASM框架时,更是苦于找不到系统且详细的介绍ASM框架如...
4
第一章 Java虚拟机栈
...
5
你遇到过StackOverflowError吗
StackOverflowError这个错误常出现在较深的方法调用以及递归方法中,平时很少会遇到。我们以一道经典的递归算法题为例,求1到n的和。为了查看在发生栈...
6
JVM运行时内存结构
Java虚拟机运行时数据区域分为方法区、堆、虚拟机栈、本地方法栈和程序计数器[1],如图1.6所示。 图1.6 JVM运行时内存结构 Java堆(Java He...
7
线程、栈与栈桢
在Java中,Java线程与操作系统一对一绑定,Java虚拟机栈也与操作系统线程栈映射,操作系统线程在Java线程创建时创建。前面介绍-Xss配置虚拟机栈的大小...
8
局部变量表与操作数栈
在了解线程、栈与栈桢的关系后,我们还要重点关注栈桢中的局部变量表与操作数栈,这两个数据结构是字节码指令执行所依赖的。 局部变量表存储方法中声明的变量、方法参数,...
9
基于栈的指令集架构
在汇编语言中,除直接内存操作的指令外,其它指令的执行都依赖寄存器,如跳转指令、循环指令、加减法指令等。汇编指令集是由硬件直接支持的,不同架构的CPU提供的汇编指...
10
本章小结
本章我们从栈溢出的例子出发,了解了栈与线程的关系、栈与栈桢的关系,同时也介绍在多线程项目中如何通过配置-Xss参数调优,降低进程占用的内存,以及如何通过NAT工...
11
第二章 Class文件结构
我们编写的Java代码虚拟机并不能直接解释执行,而是需要先由编译器编译生成class二进制文件,在程序运行时再由类加载器加载解析生成类元数据存放在方法区中,最后...
12
项目框架搭建
分析class文件结构的工具有很多,可分为两类。一类是基于十六进制的分析工具,如010editer、UE;另一类是可视化的class文件结构分析工具,如开源的c...
13
解析魔数
根据表2-1可知,魔数占四个字节,它只是用来确定这个文件是否是一个class文件。魔数固定值为0xCAFEBABE,这个值永远不会改变。 魔数解析的实现很简单,...
14
解析版本号
class文件结构的版本号分为主版本号和副版本号,它们共同构成class文件格式的版本号[1]。比如一个class文件的主版本号为56,副版本号为0,那么这个c...
15
解析常量池
Java虚拟机执行字节码指令依赖常量池表中的常量信息,如创建对象的new指令,需要指定对象的类型描述符,new指令的操作数的值为该类型描述符对应的常量在常量池中...
16
解析class文件的访问标志
Class文件结构中的访问标志项access_flags是用U2类型存储的,也就是2个字节。用某个bit位的值是否为1判断该类或接口的访问权限、属性。访问标志与...
17
解析this与super
在Class文件结构中,紧挨着访问标志access_flags项的是this_class和super_class这两项,也都是U2类型。this_class存储...
18
解析实现的接口
解析完this_class与super_class之后,就可以继续解析获取该class实现的接口总数以及该class实现的所有接口。接口解析器Interface...
19
解析字段表
同一个Class文件中,不会存在两个相同的字段。相同指定的是字段名与类型描述符都相同。字段结构与Class文件结构一样,都有访问标志项,但两者的访问标志项,在访...
20
解析方法表
方法表存放一个类或者接口的所有方法。与字段结构一样,方法结构也有属性表,方法编译后的字节码指令是存放在方法结构的属性表中的,对应Code属性。但不是所有方法都会...
21
解析class文件的属性表
字段结构和方法结构也都有属性表,所以要注意不要将这些属性表混在一起理解。但所有属性都有一个通用的结构,这在解析字段那部分已经介绍。因此,解析class文件结构的...
22
解析ConstantValue属性
ConstantValue属性用于通知虚拟机在类或接口初始化阶段为被标志为ACC_STATIC的字段自动赋值,如接口中声明的字段,类中声明的静态常量字段。其它非...
23
解析Code属性
字节码指令存储在方法结构的属性表的Code属性中。这一节我们将通过完成对Code属性的二次解析了解Code属性,了解字节码指令是怎么存储的在Code属性中的。 ...
24
本章小结
这一章我们通过编写一个简单的Class文件结构解析工具项目,不仅对Class文件结构有了深刻的了解,还能自己实现Class文件结构的解析。了解Class文件结构...
25
第三章 字节码指令
Java虚拟机的指令是由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零个或多个代表此操作所需参数(称为操作数,Oper...
26
从Hello Word出发
与学习一门编程语言一样,我们通过使用Java代码编写一个Hello World程序,使用javap[1]工具查看Hello World程序的字节码,并分析每条字...
27
字段与方法描述符
描述符本是第二章的内容,没有在第二章详解是考虑到放在第二章可能不容易理解,因此关于描述符放在本章作为补充内容讲解。 描述符分字段描述符和方法描述符,是一个描述字...
28
读写局部变量表与操作数栈
读写局部变量表与操作数栈就是将局部变量push进操作数栈与将操作数栈的栈顶元素存储到局部变量表的操作。 将局部变量表中的元素放入操作数栈只能放入栈顶,而将操作数...
29
基于对象的操作
Java语言是一门纯面向对象的编程语言,除访问静态方法和静态变量以及类的初始化方法外,几乎都是基于对象的操作,如调用对象的方法,在方法中访问对象自身的字段。这节...
30
访问静态字段与静态方法
与非静态方法的调用和非静态字段的访问不同,获取静态字段、修改静态字段、调用静态方法不需要一个该类型的对象引用作为隐式参数,且静态方法的局部变量表不会存储this...