跟我一起学JVM(五)——类文件结构

本章节内容涉及到一部分的计算机组成与设计,汇编语言以及Java语言的内容。

1.无关性基石
因为JVM只关注Class文件的解析运行,负责将Class文件转化成机器码与本机操作系统进行交互。
所以任何语言只要能将程序编译成JVM接受的Class文件格式,就可以放到JVM上运行。现在市面上有
很多将其他语言转化成JVM识别的字节码编译器,比如JRubyc,groovyc编译器等等。

2. Class类文件结构
当我们使用javac命令编译Java文件后,会得到一个.class文件,曾经很好奇的打开过这个class文件,
结果发现是一串“乱码”,于是很烦躁的就把文件关闭了。其实这段乱码是有意义的,他们蕴藏了Java程序的
版本,常量数,方法,属性等信息。通过对每个部分进行解读有助于了解JVM到底是怎么工作的。

(1)魔数
作用是确定这个文件是否为一个能被虚拟机接受的Class文件
在这里插入图片描述
(2)Class文件版本
其中第五第六个字节是次版本号,虚拟机可以向下兼容老版本,拒绝执行超过其版本号的Class文件
在这里插入图片描述
(3)常量池
I.字面量:文本字符串,声明为final的常量值等
II.符号引用:类和接口全限定名(包名和类名),字段的名称和描述符,方法名称和描述符
特点:
I.常量池的大小不固定
II. 常量池容量计数从1开始,0作为“不可引用任何一个常量池项目”的特殊用途
III.常量池是class文件中占用空间最大的部分之一
IV.常量一般由一张二维表构成,记录常量值的同时还有该常量的信息

(4)访问标志
用于识别一些类或接口层次的访问信息,比如:这个Class是类还是接口,是否是public类型,是否是abstract类型
(5)类索引
类索引用于确定这个类的全限定名
父类索引用于确定这个类的父类的全限定名。由于Java语言不允许多重继承,所以父类索引只有一个。
接口索引集合用来描述这个类实现了哪些接口

(6)字段表集合
描述接口或类中声明的变量,可用于反汇编得到源码
(7)方法表集合
和字段表基本一样的原理,用来描述方法的
(8)属性表集合
Class文件,字段表,方法表都可以携带自己的属性表集合,用于描述某些场景专有的信息。

3.字节码指令集
Java语言的设计初衷就是为了面向网络,智能家电等技术,所以不断的追求尽可能小的数据量,尽可能高的传输效率。
所以在设计Java字节码指令集的时候,工程师限制了操作码长度为1字节,这也就意味着操作码总数不得超过256条。

不考虑异常处理,JVM解释器可以使用以下伪代码作为执行模型

do{
	自动计算PC寄存器值+1;
	根据PC寄存器的指示位置,从字节码流中取出相应的操作码;
	if(字节码存在操作数){
		从字节码中取出操作数;
	}
	执行操作码定义的操作;
}while(字节码长度>0)

此处就举一个同步指令的例子:
Java虚拟机可以支持方法级的同步和方法内部一段指令的同步,这两种同步的结构都是使用管程(Monitor)来支持的

虚拟机可以从方法常量池方法表中的ACC_SYNCHRONIZED访问标志了解这个方法是不是同步方法,如果设置了这个同步标志,那么执行线程需要先
成功持有管程,然后才能执行方法,最后当方法完成时释放管程。在方法执行期间,执行线程持有了管程,其他线程就无法再获取到同一个管程。如果一个同步
方法执行期间出现异常,并且在方法内部无法处理这个异常,那么这个同步方法所持有的管程将在异常抛到同步方法之外时自动释放。

Java虚拟机中采用monitorenter和monitorexit支持synchronized关键字。
Class文件结构随着技术的发展而发展,不断有新的访问标志加入,比如枚举,泛型以及动态注解等


Instagram: https://www.instagram.com/barrywzc/
Twitter: https://twitter.com/BarryWa34098316
Bilibili: https://space.bilibili.com/473161964
GitHub: https://github.com/wzcwzcwzc
Patreon: https://www.patreon.com/wzcspace
WeChat: wzcspace


Please leave a LIKE and SUBSCRIBE for more content!

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值