《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版》读书笔记与常见面试题总结
本节常见面试题(推荐带着问题阅读,问题答案在文中都有提到):
简单介绍一下Class类文件结构(常量池主要存放的是那两大常量?Class文件的继承关系是如何确定的?字段表、方法表、属性表主要包含那些信息?)
1 概述
2 Class类文件结构
Class文件格式采用一种类似于C语言结构体的伪结构来存储数,这种伪结构有两种数据类型:无符号数和表。
2.1 魔数与Class文件版本
2.2 常量池
2.3访问标志
2.4 类索引、父类索引与接口索引集合
2.5 字段表集合
字段表(field info)用于描述接口或类中声明的变量。字段包括类级变量以及实例变量,但不包括在方法内部声明的局部变量。
2.6方法表集合
2.7 属性表结合
3 字节码指令简介
3.1字节码与数据类型
3.2 加载和存储指令
加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传输。
3.3 运算指令
3.4 类型转换指令
类型转换指令可以将两种不同的数值类型进行相互转换。(比如int类型转换为float类型)
小范围到大范围类型安全转换,无需显式的转换指令,否则必须显式的使用转换指令来完成。
3.5 对象创建与访问指令
虽然类实例和数组都是对象,但java虚拟机对类实例和数组的创建和操作使用了不同的字节码指令。
3.6 操作数栈管理指令
如同操作数据结构中的栈一样,java虚拟机也提供了一些用于直接操作操作数栈的指令,如:
3.7 控制转移指令
可以认为控制转移指令就是在有条件或无条件地修改PC寄存器的值。
3.8 方法调用和返回指令
- invokevirtual 指令用于调用对象的实例方法
- invokeinterface指令用于调用接口方法
- invokespecial指令用于调用一些需要特殊处理的实例方法
- invokestatic指令用于调用类方法(static方法)
- invokedynamic指令用于在运行时动态解析出调用点限定符所使用的方法。
方法调用指令与数据类型无关,而方法返回指令是根据返回值的类型区分的。
3.9 异常处理指令
在java虚拟机中,处理异常(catch语句)不是由字节码指令来实现的,而是采用异常表的方式。
3.10 同步指令
java虚拟机可以支持方法级的同步和方法内部一段指令序列的同步,这两种同步结构使用管程(Monitor)来支持的。
4 虚拟机实现的两种方式
5 class文件结构的发展
总结:
Class文件是java虚拟机执行引擎的数据入口,也是java技术体系的基础构成之一。本节主要介绍了Class文件结构中的各个部分,以及每个部分的定义、数据结构和使用方法。