【题外话】由于有大牛在论坛里贴出翻译的《Java虚拟机规范》,我也就不用写那么详细了,哈哈,觉得那里需要写就写一下吧
Java代码的字节码可以通过 javap 命令生成
JVM的指令通用格式为:
<index> <opcode> [<operand1> [<operand2>...]] [<comment>]
可以认为,方法的JVM字节码存放在一个Code[]数组中,
• <index>就是该数组中存放的操作码的索引,
• <opcode>是操作码的助记符号
• <operandN>是指令的操作数
• <comment>是行尾的语法注释
下面看一个例子
void spin() {
int i;
for (i = 0; i < 100; i++) {
;
// Loop body is empty
}
}
编译后的代码如下 (与《Java虚拟机规范(java SE 7)》上看到的不一样,不知道是不是JDK版本的问题)
void spin();
Code:
0: iconst_0
1: istore_1
2: iload_1
3: bipush 100
5: if_icmpge 14
8: iinc 1, 1
11: goto 2
14: return
调用一个新的方法,就产生一个新的帧栈(Frame),如下图,在一个帧栈中,含有操作数栈(Operand Stack)和局部变量表(Local Variables),注意,此图只是用来表示在此期间发生的操作,并不直观的表示内存中的实际状态。
STEP1--> 0: iconst_0
Code[]数组的第0行,表示把int型的0值压入操作数栈,注意,在局部变量表中,索引为0的位置存放的局部变量是指向调用当前方法的类实例的指针,即this指针
指令iconst_<i> 中的i表示的int 常量 −1、0、1、2、3、4、5
STEP2--> 1: istore_1
从操作数栈中弹出一个int型的操作数(即常量0),然后将其放置在局部变量1号位置(0号位置已被this占据)
STEP3--> 2: iload_1
从局部变量表中获得1号位置变量的值,将其压入操作数栈
STEP4--> 3: bipush 100
在操作数栈中加入int型的常量100
STEP5--> 5: if_icmpge 14
该命令和《Java虚拟机规范》得到的不太一样,但起到的功能是一样的,可以查一下JVM 的在线文档,发现此命令的介绍如下:
if_icmpge pops the top two ints off the stack and compares them. If value2 is greater than or equal to value1, execution branches to the address (pc + branchoffset), where pc is the address of the if_icmpge opcode in the bytecode and branchoffset is a 16-bit signed integer parameter following the if_icmpge opcode in the bytecode. If value2 is less than value1, execution continues at the next instruction.
即将操作数栈中的两个int值弹出栈,然后比较它们,如果value2(即这里的0)大于或等于value1(即这里的100),则跳转至14行执行,否则就继续执行。很显然,这里0<100,所以继续执行下面的代码。
STEP6--> 8: iinc 1, 1
该命令给局部变量表的1号位置的int值增加1,如图,原来的0变成了1
STEP7--> 11: goto 2
很显然,这一条的命令就是让下一条执行语句跳至2,即 iload_1,然后便继
续执行…
STEP8--> 14: return
当局部变量1号位置的值(即程序中的i)大于100后,便满足了
5: if_icmpge 14这条语句的条件,程序跳到14,遇到了return命令,该方法完成
分享到:
相关推荐
文档提供了一个指令集摘要,详细介绍了不同类型的指令,如加载/存储指令、算术指令、类型转换指令、对象创建与操作指令、操作数栈管理指令、控制转移指令、方法调用与返回指令以及抛出异常指令等。 10. Special ...
由于Java虚拟机(JVM)基于堆栈的实现方式,处理器的存储体系结构与传统的RISC(精简指令集计算)处理器有所不同。文章提出了一种针对实时Java处理器的指令预取方案,该方案很好地适应了Java特有的体系结构。 ...
5. 指令集:JVM使用字节码作为中间语言,如`aload_0`表示加载局部变量表的第一个引用类型变量。字节码通过解释器或即时编译器(JIT)转化为机器码执行。 6. 内存管理:Java的内存管理主要包括自动垃圾收集,采用...
6. 规范的作用:JVM规范作为Java平台的基础性文档,规定了JVM的内部架构、数据类型、指令集、运行时数据区、垃圾收集机制等核心内容,是Java开发者和虚拟机实现者必须遵循的标准。 综合以上内容,我们可以看到...
本资源摘要信息涵盖了Java高级面试题附答案汇总(2021年Java面试题及答案大全),涵盖了多个知识点,包括Java高级面试题、序列化、多线程同步、GC算法、集合类型、JDK自带的监控和性能分析工具等。 1. ...
JVM对下列各项做出了定义:指令集、寄存器、类文件格式、栈、垃圾收集堆、存储区。 Java虚拟机的功能包括: * 通过ClassLoader寻找和装载Class文件 * 解释字节码成为指令并执行,提供Class文件的运行环境 * 进行...
CPU执行指令,内存用于存储程序运行时的数据,硬盘则用于长期存储数据。程序的运行基于冯·诺依曼体系结构,即计算机通过输入、处理、输出和存储四个步骤执行任务。 #### 2. 不同类型语言的编译与运行 编程语言大致...
类装载器是Java应用程序运行的核心组成部分,它负责加载类到JVM中。在Tomcat中,类装载器有明确的层次结构,每个Web应用程序都有自己的类装载器,以确保类的隔离。在示例中,通过context.xml配置资源,如邮件服务,...
算法是解决特定问题的步骤或指令集。在加密和解密领域,常见的算法包括对称加密(如DES、3DES、AES)、非对称加密(如RSA、ECC)、哈希函数(如MD5、SHA-1、SHA-256)以及消息认证码(MAC)等。这些算法都有其独特...