一、JVM和Java体系结构( 四 )


指令用于将一个短整型大小的常数值(-32768到32767)推送到操作数栈中 。它的操作码为0x11,后面跟着一个16位有符号整数表示要推送的常数值 。
这两个指令常用于编写Java字节码,而不是直接编写Java源代码 。在Java编译器将源代码编译成字节码时,常量值会被推送到操作数栈中,这些指令在这个过程中被使用 。
是Java字节码指令之一,用于将整数常量-1推送到操作数栈中 。
Java虚拟机提供了一组特殊的指令,可以将整数常量-1到5快速地推送到操作数栈中,其中包括、、、、、和 。
的操作码为0x02,表示将整数常量-1推送到操作数栈中 。其他常量指令的操作码和作用也类似 。
这些常量指令可以提高Java字节码的执行效率,因为它们比使用或指令更短,执行速度也更快 。
如果要将浮点数常量推送到操作数栈中,可以使用fconst_0、fconst_1和fconst_2指令,分别用于将浮点数常量0.0、1.0和2.0推送到操作数栈中 。如果要将长整数常量推送到操作数栈中,可以使用lconst_0和lconst_1指令,分别用于将长整数常量0和1推送到操作数栈中 。如果要将双精度浮点数常量推送到操作数栈中,可以使用dconst_0和dconst_1指令,分别用于将双精度浮点数常量0.0和1.0推送到操作数栈中 。如果要将字符串常量推送到操作数栈中,可以使用ldc指令,该指令需要一个常量池索引作为参数,该索引指向一个字符串常量在常量池中的位置 。需要注意的是,每种类型的常量指令都只能用于将特定类型的常量推送到操作数栈中,不能将其他类型的常量使用这些指令推送到操作数栈中 。
8.3、总结
由于跨平台性的设计,Java的指令都是根据栈来设计的 。不同平台CPU架构不同,所以不能设计为基于寄存器的 。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令 。
时至今日,尽管嵌入式平台己经不是Java程序的主流运行平台了(准确来说应该是的宿主环境已经不局限于嵌入式平台了),那么为什么不将
架构更换为基于寄存器的架构呢?
将架构更换为基于寄存器的架构并不一定是最优的选择,因为:1. 兼容性问题:现有的Java程序都是基于栈式架构的虚拟机运行的,如果要将架构更换为基于寄存器的架构,需要重新编写和调整Java程序,这会带来很大的兼容性问题 。2. 硬件成本问题:基于寄存器的架构需要更多的寄存器,这会增加硬件成本 。此外,基于寄存器的架构需要更多的硬件支持,比如更复杂的指令集和更高的性能要求,这也会增加硬件成本 。3. 性能问题:尽管基于寄存器的架构可以提高一些性能指标,但是在某些情况下,栈式架构的虚拟机也可以达到很高的性能水平 。此外,现在的硬件技术和虚拟机优化技术也可以在栈式架构下实现很高的性能 。综上所述,将架构更换为基于寄存器的架构并不一定是最优的选择,而现有的栈式架构的虚拟机已经可以在嵌入式平台上运行得很好了 。
栈:跨平台性、指令集小、指令多;执行性能比寄存器差
9、JVM的生命周期 9.1、虚拟机的启动
Java虚拟机的启动是通过引导类加载器( class )创建一个初始类( class)来完成的,这个类是由虚拟机的具体实现指定的 。
9.2、虚拟机的执行9.3、虚拟机的退出
有如下的几种情况:
10、JVM的发展历程 10.1、SunVM
早在1996年Java1.0版本的时候,Sun公司发布了一款名为 VM的Java虚拟机,它同时也是世界上第一款商用Java虚拟机,JDK1.4时完全被淘汰 。
这款虚拟机内部只提供解释器 。