admin 管理员组

文章数量: 1087139


2024年4月24日发(作者:switch语句case后只能为)

java 打包成jar文件run指令

000

前段 时间由于研究原来广为传播的String和StringBuffer的性能问题,

自己做了几个小实验并得出一些结论,但是从网友的反应来看那个研究并没有

起到应有的目的,而且网友也很中肯的提出了自己的意见并对实验中的一些内

容指出了其缺陷,针对他们的反应我又反编译了代码来进行对比,但是几位网

友仍然不 是很信服,而且上次实验的结果和反编译得到的结论并不能完全吻合,

因为反编译代码的对比基本上是基于语句的多少,因此这个这个对比也确实不

能使人信服,但 是这给我的下一步行动指引了方向:研究JVM指令和JVM结构,

在对反编译后的代码有完全的理解才能给出可能使人信服的结论。

本文以及以后将要写的一些文章就是我研究JVM规范的一些心得,我希望

在和大家共同理解的基础上进行我们下一轮的深入研究。

好,闲话少说,开始我们的正文。

JVM执行的对象就是大家非常熟悉的class文件,我们也称为类文件,

JVM规范定义的这个编译完成的代码文件(虽然并非强制要求是实际的文件)的

格 式非常的详实,但是我们这里只说一些宏观的内容,以后有机会再研究细节

的内容吧。JVM要求的类文件的格式是和硬件和操作系统无关的一种二进制格

式,它精 确定义了类或者接口的表示,它甚至包含了字节顺序这样的细节,而

字节顺序在特定平台的目标文件格式中一般都是固定的,不会进行说明。

JVM所支持的数据类型和Java语言规范中定义的几乎一样,请注意是几

乎一样!也就是原始类型和引用类型,他们可以被存储在变量表中,也可以作

为参数传 递、被方法返回,更通常的就是成为操作的对象。为什么和Java语

言规范中定义的不完全一样呢?因为JVM中有一种Java语言所没有的原始类型:

返回地 址类型(returnAddress type)。该类型是jsr, ret以及jsr_w指令需

要使用到的,它的值是JVM指令的操作码的指针,并且它的值是不能被运行中

的程序所修改的。

另外需要提到的就是布尔类型的值,虽然在Java语言中它是完全独立的值,

但是在JVM中只提供了对它的有限支持,表现在:

没有单独的操作布尔类型的指令,源代码中的布尔类型的操作在编译以后

是作为int类型的值进行操作的。

JVM直接支持布尔数组,newarray指令可以创建布尔数组,而它的访问和

修改操作却是使用byte类型的数组的操作指令进行的:baload, bastore。(在

JDK1.0,1,1以及1.2中,布尔数组被编码为byte数组,每个元素是8位)JVM

用1代表true,用0代表false, 编译器将源代码中的布尔类型映射为JVM中

的int类型,而且必须和JVM的要求一致。

另外JVM规范中对于浮点类型的数据有大段的说明,我没有怎么看,主要

是讨论JVM的浮点型和IEEE 754的关系的。

关于类型的另外一个需要提一下的是类型检查。JVM期望几乎所有的类型

检查已经在运行之前完成了(通常是由编译器进行检查的)而不用JVM自己来检

查。 原始类型的值不需要被标记或者在运行时被检查以确定他们的类型,同样

他们也不用和引用类型的值进行区分,区分工作是由JVM的指令集来完成的,

JVM的指 令集使用不同指令来区分它要操作的值的类型,例如iadd, ladd,

fadd以及dadd是用于将两个数字相加并产生数字类型结果的所有JVM指令,

但是每个指令都是针对特定类型的,分别对应int, long, float以及double。

JVM包含对对象的显式支持。类是动态分配的类实例或者是一个数组,JVM

中的引用类型就是对一个对象的引用,引用类型的值可以想象为对象的指针,

一个对象同时可能存在多个对它的引用,对象总是通过引用被操作、传递或者

测试的。

对于引用类型,需要提及的一点就是关于null,它最初是没有运行时类型


本文标签: 类型 操作 进行 研究 引用