近期,由于某种原因-小白的我开始接触学习JVM相关知识。特此,将近期学习的知识记录一下,以供后期复习使用。若有不正之处,还请各路大神批评指正。
一、JVM概述 Java Virtual Machine
java虚拟机,一种程序软件,是java程序运行的环境,跨平台的实现基石;
jvm与class文件有必然联系,和java语言没有关系;
java产品:HotSpot(Oracle jdk 与 OpenJdk(默认))
JVM规范:官方文档 https://docs.oracle.com/javase/specs/index.html
orcal 官网文档:https://docs.oracle.com/en/java/javase/index.html
openJdk 官网文档:https://openjdk.java.net
学习网站:
https://dzone.com--各大技术网站不仅限于java
https://www.javaworld.com--专注于java学习的网站
二、class 文件结构 (这里指 jdk1.8)
官方文档是这样规定的:https://docs.oracle.com/javase/specs/jvms/se8/html/index.html
如果官方文档英文看不懂,这里可以使用 google 自带的翻译插件进行翻译查看;
那么 ,idea 有个插件 jclasslb bytecode 可以查看编译后的class 文件结构,很明确的介绍了类的结构信息;
Class 文件格式:一个class文件由一个 8 位字节的流组成。所有 16 位、32 位和 64 位数量都是通过分别读取两个、四个和八个连续 8 位字节来构造的。多字节数据项始终以大端顺序存储(ps:原因是因为这符合人类的读取习惯),其中高字节在前。
存储有两种形式:
1)高端模式-高位低存:如字节位置有 4X001、4X002、4X003、4X004,若想存储一个数值1234,那么实际上的存储形式是:数字1(高位值-千位)存储于高位4X001、数字2(百位)存储于4X002、数字3(十位)存储于4X003、数字4(个位)存储于4X004。
2)低端模式-低位高存:与高端模式刚好相反。
这里贴一张 class 文件结构学习时的思维结构图:
1.class 一般信息
magic 魔数 jvm 用来判定是否是 class 文件格式的判定标准:固定值 :CAFEBABE
java 文件 经 javac 编译成 class 文件; javap -v + class文件名 可以查看字节码文件;
2.常量池 cp_info constant_pool[constant_pool_count-1]
常量池符号表类型:
问题1:接口的父类是不是 Object ?可以通过Idea 的jclassLb插件 反向论证:
首先,创建两个class 类 ca,cb ,然后ca extends cb ,build之后查看 jclasslb->content pool classInfo 信息,只有两个类:ca,和 cb ,并没有出现Object ,也以此论证了存储于class_Info常量池中的信息,只储存类本身自己和直接父类;
然后,同理,按照上述说明,再创建两个interface 接口:Ia ,Ib ,然后将Ia extends Ib ,再次查看,共有三种信息:
Ia,Ib,Object ,按照第一步的说明,此时这里不应该出现Object ,但是接口中仍旧出现,则以此反证:接口的基类不是Object;
以上内容是初始JVM 涉及到的 class 文件结构体内容,以及经过编译后的class 文件结构存储形式,这里可以使用 idea 插件 jclasslb bytecode 进行查看;