【题外话】只要学过编译原理,计算机组成类似的课程的,就不会觉得JVM的字节码太难理解。有兴趣的人,只要边看书,边写几个例子后,再javap一下慢慢看几个就大概心里有数了,其实学习JVM的东西,主要是为了让自己对它的运行方式多一些了解,在实际编程过程中心里有个概念,有些特性的底层实现心里有数就行。
毕竟在大多数编程中,JVM的知识不会直接的影响到你的编程思路,但会潜移默化的让你绕过一些潜在的风险或者障碍。
下面稍微介绍两个概念:
接收参数 和
方法调用
接收参数
实例方法(非静态方法)和类方法(静态方法)的实现是略有不同的,因为当调用一个实例方法时,首先会将该类的自身的实例的引用作为第0个参数放置在局部变量表中,然后才在局部变量表的第1到N的位置上放置参数(如果有参数, N是参数个数)。
而静态方法不需要传递自身实例的应用,所以参数是从第0个开始存放。
(要注意long和double所占局部变量的大小为2)
大家可以用下面这两个例子做下测试
//example_1
int addTwo(int i, int j) {
return i + j;
}
//example_2, static method
static int addTwo(int i, int j)
{
return i + j;
}
方法调用
对普通实例方法(即非静态方法)调用是在运行时根据对象类型进行分派的(相当于在C++中所说的“虚方法”), 这类方法通过调用invokevirtual指令实现。
下面看一个简单的例子,然后是其字节码:
public class JVM_3_addTwo {
int addTwo(int i, int j)
{
return i + j;
}
int add12And13(){
return addTwo(12, 13);
}
}
...
int addTwo(int, int);
Code:
0: iload_1
1: iload_2
2: iadd
3: ireturn
int add12And13();
Code:
0: aload_0
1: bipush 12
3: bipush 13
5: invokevirtual #2; //Method addTwo:(II)I
8: ireturn
}
其具体流程如下(图只是用来参考,并不一定完全正确...)
STEP1:
从局部变量表load当前类实例的指针,将其push到操作数栈
STEP2:
将常量12和13分别push到操作数栈
STEP3:
调用addTwo方法,在调用该方法时,JVM创建一个新的frame,并将自己实例的指针,以及参数12和13传给新的Frame中的局部变量表。
注:每条invokevirtual指令都会带有一个表示索引的参数,如图中的#2, 通过该标识,JVM可以通过查找常量池找到方法addTwo的符号引用,该符号引用可以提供方法所在对象的类型的内部二进制名称、方法名称和方法描述符
STEP4:
目前的操作都针对Frame_addTwo中的操作数栈,如图,从局部变量表加载位置的变量和位置2的变量,即12和13
STEP5:
求和运算,将结果25压入到操作数栈中
STEP6:
addTwo()方法返回,将其栈顶的值(即25)push到其调用者(即add12And13)方法所在的操作数栈,并且在该调用完成后,addTwo所拥有的frame就被删除掉。
STEP7:
add12And13()方法返回,将其栈顶的值(即25)push到其调用者所在的操作数栈,并且在该调用完成后,add12And13所拥有的frame就被删除掉。
分享到:
相关推荐
JVM学习-字节码指令集(三)代码
在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,而"JVM指令手册 中文版"则提供了JVM可执行的所有指令的详细信息。下面,我们将深入探讨JVM的...
【标题】"nginx-upstream-jvm-route-1.15" 涉及的核心知识点是Nginx的upstream模块与JVM路由的整合,特别针对Nginx 1.15版本。这个项目旨在解决在配置Nginx时遇到的特定错误提示“nginx: [emerg] invalid parameter ...
深入理解Java代码执行过程--JVM 指令集
Moonbox(月光宝盒)是JVM-Sandbox生态下的,基于jvm-sandbox-repeater重新开发的一款流量回放平台产品。在jvm-sandbox-repeater基础上提供了更加丰富功能,同时便于线上部署和使用,更多对比参考。 使用场景 你...
《深入JVM---JVM命令---invokespecial》 在Java虚拟机(JVM)的世界里,`invokespecial`指令扮演着至关重要的角色。它主要用于执行对象的构造方法(即`<init>`方法),以及调用私有方法和父类非静态方法。本文将...
**Java虚拟机(JVM)基础** Java虚拟机(JVM)是Java平台的核心组成部分,它是Java程序运行的引擎。JVM负责解析字节码,执行类文件,并为应用程序提供了一个跨平台的运行环境。本资料《JVM基础-超清文字版.pdf》将...
赠送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堆栈分析
此资源有两个文件,含 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...
JVM指令集是JVM的核心组成部分,它定义了JVM能够理解和执行的一系列低级操作指令。这些指令构成了Java程序在运行时的微观世界,对理解JVM的工作原理至关重要。下面我们将深入探讨JVM指令集及其重要性。 1. **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
"ssl-provider-jvm16-0.2.jar"是一个针对JVM 1.6的SSL(Secure Socket Layer)提供者。SSL是一种网络通信安全协议,主要用于确保数据在网络传输过程中的安全,通过使用公钥/私钥技术进行身份验证和数据加密。此提供...
本文将详细介绍标题为"ant-eclipse-jvm1.2-1.0.jar.zip"的压缩包,以及其中包含的文件和它们在软件开发中的作用。 首先,我们要理解这个文件名的含义。"ant-eclipse-jvm1.2-1.0.jar.zip"暗示这是一个与Ant和Eclipse...
jvm-full-gc调优-jvm-full-gc
jvm调优-jvm
jvm指令集