【题外话】由于有大牛在论坛里贴出翻译的《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命令,该方法完成
分享到:
相关推荐
JVM学习-字节码指令集(三)代码
JVM图解-JVM指令-JVM原型图.rar
深入理解Java代码执行过程--JVM 指令集
nginx-upstream-jvm-route 支持nginx版本1.15 解决nginx: [emerg] invalid parameter "srun_id=tomcat1" 问题
Moonbox(月光宝盒)是JVM-Sandbox生态下的,基于jvm-sandbox-repeater重新开发的一款流量回放平台产品。在jvm-sandbox-repeater基础上提供了更加丰富功能,同时便于线上部署和使用,更多对比参考。 使用场景 你...
bcprov-ext-jdk15on-1.54.jar、bcprov-jdk15on-1.54.jar和ssl-provider-jvm16-0.2.jar附件下载
赠送jar包:metrics-jvm-3.1.5.jar; 赠送原API文档:metrics-jvm-3.1.5-javadoc.jar; 赠送源代码:metrics-jvm-3.1.5-sources.jar; 赠送Maven依赖信息文件:metrics-jvm-3.1.5.pom; 包含翻译后的API文档:...
1、java虚拟机的基本介绍。 2、字节码的执行 3、常用的jvm参数配置 4、算法和种类 5、gc参数配置 6、类加载器 7、性能监控工具 8、jvm堆栈分析
JVM基础-超清文字版.pdf 这个是带完整目录书签的文字版本,文本内容可以复制的哦
此资源有两个文件,含 nginx-upstream-jvm-route 和 nginx 对应版本,都是tar.gz文件。 安装方法网上很多就不写了,亲测可用。 不用担心版本不匹配造成安装失败,再浪费积分去到处下载尝试的烦恼。 此资源有两个文件...
JVM规范--高手总结 Java相关 1 1.1Java定义 1 1.2Java的开发流程 1 1.3Java运行的原理 2 1.4半编译半解释 3 1.5平台无关性 4 JVM内存模型 4 2.1 JVM规范 5 2.2 Sun JVM 8 2.3 SUN JVM内存管理(优化) 10 2.4 SUN JVM...
赠送jar包:metrics-jvm-3.1.5.jar; 赠送原API文档:metrics-jvm-3.1.5-javadoc.jar; 赠送源代码:metrics-jvm-3.1.5-sources.jar; 赠送Maven依赖信息文件:metrics-jvm-3.1.5.pom; 包含翻译后的API文档:...
kotlinx-coroutines-io-jvm-0.1.1.jar
jvm-full-gc调优-jvm-full-gc
jvm调优-jvm
JVM指令集
jvm指令集
JVM实战-JVM类加载机制案例分析
JVM 的运行机制 多线程 JVM 的内存区域 JVM 会创建操作系统的接口创建一个原生线程。JVM 线程和操作系统线程是一一对应的