Java虚拟机有自己完善的硬件架构,如处理器、堆栈等,还具有相应的指令系统。Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的操作码以及跟随其后的零至多个代表此操作所需参数的操作数所构成。虚拟机中许多指令并不包含操作数,只有一个操作码。下面就为大家介绍一下日常使用JVM用到的JVM指令。
1.newarray指令
创建一个指定原始类型(如int、float、char等)的数组,并将其引用值压入栈顶。
执行该指令后,将从操作数栈出栈1个参数count,类型为int,表示要创建数组的大小。
2.iastore指令
从操作数栈读取一个int类型数据并存入指定数组中。
执行该指令后,将从操作数栈出栈3个参数arrayref、index和value,在本例中分别对应于第10、11和13索引位置压入的值。
其中,arrayref是一个引用类型值,指向一个int类型的数组。index和value为int类型,index表示待存入数组位置的索引号,value表示待存入index索引位置的值。
3.iaload指令
从数组中加载一个int类型数据到操作数栈。
执行该指令后,将从操作数栈出栈2个参数arrayref和index,在本例中分别对应于第15和16索引位置压入的值。
其中,arrayref是一个引用类型值,指向一个int类型的数组。index为int类型,表示待加载数组数据的索引号。
4.aastore指令
(aastore指令与iastore指令作用类似)
从操作数栈读取一个引用类型数据并存入指定数组中。
执行该指令后,将从操作数栈出栈3个参数arrayref、index和value,在本例中分别对应于第8、9和10索引位置压入的值。
其中,arrayref是一个引用类型值,指向一个引用类型的数组。index为int类型,index表示待存入数组位置的索引号。value为引用类型,表示待存入index索引位置的值。
在运行时,value的实际类型必须与arrayref所代表的数组的组件类型相匹配。
5.multianewarray指令
创建指定类型和指定维度的多维数组(执行该指令时,操作数栈中必须包含各维度的长度值),并将其引用值压入栈顶。可以用于创建所有类型的多维数组。
对于本实例,数组类型为[[[I,即#16对应的常量池中的符号引用。数组维度为2,两个维度的长度值分别为10和5。虽然int[][][]为3维数组,但由于仅指定了前2个维度的长度值,因此指令对应的维度值为2。
如果指定了第3个维度的长度值,那么在iconst_5之后还需要再将1个int类型长度值压入栈。
所有的数组都有一个与之关联的长度属性,可通过arraylength指令访问。
6.tableswitch指令
用于switch条件跳转,case值连续(变长指令)。
根据索引值在跳转表中寻找配对的分支并进行跳转。
指令格式:tableswitch padbytes defaultbytes lowbytes highbytes jumptablebytes
padbytes:0~3个填充字节,以使得defaultbytes与方法起始地址(方法内第一条指令的操作码所在的地址)之间的距离是4的位数。
defaultbytes:32位默认跳转地址
lowbytes:32位低值low
highbytes:32位高值high
jumptablebytes:(high-low+1)个32位有符号数值形成的一张零基址跳转表(0-based jump table)
7. lookupswitch指令
用于switch条件跳转,case值不连续(变长指令)。
根据键值(非索引)在跳转表中寻找配对的分支并进行跳转。
指令格式:lookupswitch padbytes defaultbytes npairsbytes matchoffsetbytes
padbytes:0~3个填充字节,以使得defaultbytes与方法起始地址(方法内第一条指令的操作码所在的地址)之间的距离是4的位数。
defaultbytes:32位默认跳转地址
npairsbytes:32位匹配键值对的数量npairs
matchoffsetbytes:npairs个键值对,每一组键值对都包含了一个int类型值match以及一个有符号32位偏移量offset。
以上就是为大家介绍的日常用到的7种常用JVM指令,在使用JVM的时候难免会有用到JVM指令的时候,系统学习JVM指令以备不时之需。当然,你也可以观看本站的Java零基础教程,了解和学习更全面的JVM知识,夯实Java基础!
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习