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,它最初是没有运行时类型
版权声明:本文标题:java打包成jar文件run指令 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1713895462a656546.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论