JVM

JVM

jvm实现一次编写,跨平台到处使用。它有各种指令集和运行时的内存区域。

JVM产品

Classic VM (早期 Sun 的 Java 虚拟机)
Exact VM (早期 Solaris 平台上)
HotSpot(OracleDK与OpenJDK 默认)
JRockit (BEA 的,被 Oracle 收购,并且整合到 HotSpot 里面)
J9 (IBM 商用)
Google Android Dalvik VM (Android 上的)
KVM、CDC、CLDC(嵌入式领域)
Microsof JVM(微软的)
Graal VM(跨语言全栈虚拟机 Run Programs Faster Anywhere)

Class

jvm只和class文件相关,除了java外还有别的语言也可以产生class文件,如:kotlin,scala。他并不关心class文件是由什么语言产生的。

内存大小端
大端存储:数据低位存在高地址(人类阅读方式)
小端存储:数据低位存在低地址

我们在存放的时候是以一个存储单元为单位来存放,存储单元内部不需要再转变顺序。
例如:0001-0101存放在0号地址,不需要把它变成1010-1000!

class字节码按照大端存储

class文件结构

Class文件数据结构采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:“无符号数”和“表”.

无符号数
定义了一组专用的数据类型来表示Class文件的内容,它们包括u1、u2、u4分别代表1、2和4个字节的无符号数。

无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值。

每个无符号数严格按照顺序连续存放,它们之间没有用任何填充或对齐。


表用于描述有层次关系的复合结构的数据。

表是由多个无符号数或者其他表作为数据项构成的复合数据类型。

表的命名都习惯性地以“_info”结尾。

整个Class文件本质上也可以视作是一张表。
?

魔数

文件内容起始几个字节使用固定的内容来描述该文件类型,因此这几个字节的内容称为魔数。

class文件魔数:cafe babe

版本号

主版本(major version)记录每个大版本号,起始值为45.
次版本(minor version)记录每个小版本号,起始值为3.
jdk1.1.8=45.3
jdk8=52.0
jdk11=55.0

JVM高版本可以执行低版本class,反之异常java.lang.UnsupportedClassVersionError

class文件数据结构

class文件基本信息

class文件常量池信息

class文件访问标志信息

class文件类、接口信息

class文件字段、属性、方法信息

class文件字节码指令