这一篇其实是对前面一篇《JVM字节码执行模型及字节码指令集》的一个延续和举例。结合例子看一下条件判定和无条件跳转指令对虚拟机栈的数据操作。
我们先来看一段代码例子。这里addEspresso()添加浓度方法会判断参数,如果参数<=1那么久抛出异常。
package bytecode; /** * * Created by yunshen.ljy on 2015/6/21. */ public class CaramelMacchiato { private int espresso ; public void addEspresso(int espresso) { if (espresso > 1) { this.espresso = espresso; } else { throw new IllegalArgumentException(); } } }
然后看一下addEspresso方法的字节码如下:
0: iload_1 1: iconst_1 2: if_icmple 13 5: aload_0 6: iload_1 7: putfield #2; //Field espresso:I 10: goto 21 13: new #3; //class java/lang/IllegalArgumentException 16: dup 17: invokespecial #4; //Method java/lang/IllegalArgumentException."<init>":()V 20: athrow 21: return
这里我们来对字节码指令进行解析。
第一行和第二行指令分别是把参数espresso以及常量1 从局部变量表压入操作数栈。
第三行指令,也就是条件语句的比较指令,比较操作数栈顶,第一条第二条指令对应的值的大小,如果不满足比较条件,就会跳转到字节码的13 这个位置。也即是进入到异常处理。
第四行指令到第六行指令就是我们前面一篇介绍过的,如同setBean 方法一样的。对于field的赋值操作。
第七行 goto 指令,无条件跳转到字节码参数所指定的十二行return指令的位置,方法返回,清空方法栈。
第八行开始是异常处理。这里先是new 指令创建一个Exception对象,并且将其压入操作数栈。
第九行指令复制刚才的对象,并且压入操作数栈。
第十行是将其中一个Exception对象出栈,并调用其构造器方法。
第十一行将另外一个对象出栈,并且抛出异常,所以也是清空、结束了当前的方法栈。
相关推荐
例如,字节码文件中会包含方法的字节码指令,这些指令是JVM执行程序的具体操作。 为了查看和分析字节码文件,JDK提供了一个名为javap的工具。javap能够反编译.class文件,打印出类的结构信息,包括类的方法、字段等...
JVM指令手册详细记录了JVM的所有操作码(opcode),也就是字节码指令。这些指令是给JVM解释器或者即时编译器(JIT)使用的低级指令集。在JVM上运行的Java程序会被编译成一系列指令,然后由JVM执行。 从给定文件的...
了解JVM如何自动加载字节码对于深入理解Java应用程序的执行机制至关重要。 首先,我们要知道Java程序的类加载过程通常分为三个阶段:加载、验证、准备、解析和初始化。其中,加载阶段就是JVM查找并解析字节码文件的...
Java虚拟机(JVM)是Java程序运行的核心,它通过解析和执行字节码来实现程序的运行。字节码是一系列二进制指令,这些指令在类文件中以16进制形式表示,每条指令占据一个或多个字节。`JVM指令码表.zip`包含的`JVM指令...
第2章:字节码指令集与解析举例.mmap
每个使用Java的开发者都知道Java字节码是在JRE中运行,而JVM则是JRE中的核心组成部分,承担分析和执行Java字节码的工作,而Java程序员通常并不需要深入了解JVM运行情况就可以开发出大型应用和类库。尽管如此,如果你...
《深入解析JVM字节码调用图生成器——基于jvm-callgraph开源项目》 在Java虚拟机(JVM)的世界里,理解和优化代码执行性能是至关重要的。为了达到这一目的,开发者需要深入理解程序的运行时行为,其中就包括了类与...
虽然这部分内容没有在提供的文档中详细展开,但通常包括通过一些工具分析字节码,找出性能瓶颈,进行指令重组、方法内联、死码删除等操作,以此来提升程序运行效率。 4. 代码优化 代码优化是提高Java应用性能的一...
自己总结的jvm中字节码与类的加载的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合jvm的爱好者和学习者
JVM学习-字节码指令集(三)代码
JVM是Java Virtual ...i开头的指令操作数类型是integer类型,l开头的指令操作数类型是long类型,f开头的指令操作数类型是float类型,d开头的指令操作数类型是double,a开头的指令操作数类型是引用类型(reference)
首先,简单数值类型的指令操作主要指的是将基础的数值类型如int、long、float和double等推送到操作数栈顶。这类操作包括iconst_m1、iconst_0至iconst_5、lconst_0至lconst_1、fconst_0至fconst_2、dconst_0至dconst_...
JVM指令码表,JVM运行原理学习的必备工具。常量入栈指令、局部变量值转载到栈中指令、将栈顶值保存到局部变量中指令、wide指令、通用(无类型)栈操作指令、类型转换指令、整数运算、浮点运算等指令。
- **字节码指令**:每个字节码代表一种操作,如`aload`加载引用,`invokevirtual`调用虚方法。 - **编译优化**:JIT(Just-In-Time)编译器将热点代码编译为原生机器码,提高运行效率。 - **逃逸分析**:确定对象...
JVM字节码是Java程序跨平台运行的关键,它不仅保证了Java程序的可移植...理解JVM字节码的原理和构成对于Java开发者来说至关重要,它有助于我们深入理解Java程序的运行机制,并在性能优化、故障排查等方面发挥重要作用。
Java字节码指令集定义了一系列指令,用于控制JVM的行为,包括数据加载、存储、算术运算、跳转等。 #### 指令解析 下面将详细介绍部分Java字节码指令及其功能: ##### A 类型指令 这些指令主要涉及对象引用的加载和...
这是jvm指令码表,对于学习jvm底层原理的伙伴会有一定的帮助,对于jvm热爱和想研究的,肯定是必不可少的一份资源
JVM指令分为五类:操作数栈管理指令、局部变量表操作指令、控制流指令、字节码操作指令和对象及数组操作指令。这些指令共同构成了Java程序的运行基础。 2. **操作数栈管理指令** 操作数栈是JVM中存储数据的地方。...
Java虚拟机(JVM)是Java程序运行的基础,它负责解释和执行Java字节码,为程序员提供了跨平台的运行环境。JVM指令手册是理解JVM内部工作原理的重要参考资料,其中包含了JVM执行的所有操作指令,这些指令是构建和优化...