JVM(十):运行时数据区和常用指令


prtyaa
prtyaa 2023-12-28 16:08:39 51955
分类专栏: 资讯

关于jvm的结构之前文章也有说过,这次说一下一些指令

安装jclasslib插件,但是为毛我安装的直接出来是中文版的。。。

 

int取值0~5时JVM采用iconst_0、iconst_1、iconst_2、iconst_3、iconst_4、iconst_5指令将常量压入栈中,取值-1时采用iconst_m1指令将常量压入栈中。
当int取值-128~127时,JVM采用bipush指令将常量压入栈中。
当int取值-32768~32767采用sipush指令
当int取值-2147483648~2147483647采用 ldc 指令。

 

所以:

bipush是把6压入栈,注意栈是先进后出的。

istore_1 是弹出操作数栈栈顶元素(这个栈顶元素就是6),保存到局部变量表第1个位置(第一个位置就是 a )

bipush 6 和istore_1 完成了 int a = 6; 也就是先把6压入栈里,然后再弹出到局部变量表索引为1的位置上

iload_1: 把局部变量表里的第一个slot中的整形值复制到操作数栈顶。这时候局部变量表里第一个位置是6,所以拿出来入栈,这个6又进栈了,在栈顶。

iincr 1 by 1: 注意因为上面是 iload_1 ,所以局部变量表里有6,栈里也有6,所以iincr 1by 1是把局部变量表里的6进行了自增1,所以局部变量表里的现在成了7,

istore_1: 是把栈里的6弹出来,保存到局部变量表里的索引为1的位置上,所以那个7又被替换成6了。

getstatic:是运行静态函数打印

iload_1:把局部变量表里的第一个slot中的整形值复制到操作数栈顶。这时候局部变量表里第一个位置是6(由7变成了6),所以拿出来入栈,这个6进栈了,在栈顶。为什么要入栈?因为要打印了,所以打印的是栈里的数据。

 

istore类似于赋值操作

下面继续几个小例子巩固一下:

bipush:把100压入栈,istore_1:把栈顶的元素100,弹出赋值给局部变量表索引为1的位置,所以a = 100 索引0是参数args。索引1是a


sipush:把300压入栈,istore_2:把栈顶的元素300弹出给局部变量表索引为2的位置。2的位置上是 i,那0和1上放的谁呢?0上放的this,1上放的参数x,因为是成员方法,所以0上永远放的this.然后接下来就是参数


这里需要传参了,但是我没有传,假如x=5,y=6,那么就是iload_1:把局部变量表索引为1位置上的x=5,把5入栈,iload_2:把6入栈,iadd:把6和5弹出栈,做加法运算,然后再把5+6的结果11放入栈顶,istore_3:再把栈顶的11弹出来放到局部变量表索引为3的位置上,索引3号是 i。所以 i=11


new 指令:在堆内存里开辟了一块空间,并且给对象默认值,然后把对象的地址压入栈里。

dup指令:复制对象地址一份,继续压入栈。

所以现在栈里的两个地址都指向堆内存中的那块空间

invokespecial:调用init,执行构造方法的时候,会把dup复制的那个对象地址从栈里弹出去,因为执行构造方法的时候,会告诉虚拟机哪个对象执行,所以会吧这个对象地址弹出来。所以执行完invokespecial的时候,对象里的里面的值就会赋初始值了,对象就构造完成了。

然后astore_1:把栈里的对象地址弹出来赋值给 t (假如后面有代码t调用xx方法的话,那么接下来就是aload_1,继续进栈才能调用xx方法,执行xx方法的时候,又要出栈)


当执行完test方法的时候,会return test方法里的值,是5,因为传参就传了5,所以这个5就进了main方法的栈顶,不管有没有用都会pop把5从main方法的栈顶弹出来。


后续还有很多指令,遇到了再说

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=31772
赞同 0
评论 0 条
prtyaaL2
粉丝 1 发表 2553 + 关注 私信
上周热门
如何使用 StarRocks 管理和优化数据湖中的数据?  2966
【软件正版化】软件正版化工作要点  2885
统信UOS试玩黑神话:悟空  2855
信刻光盘安全隔离与信息交换系统  2743
镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态  1277
grub引导程序无法找到指定设备和分区  1244
华为全联接大会2024丨软通动力分论坛精彩议程抢先看!  169
2024海洋能源产业融合发展论坛暨博览会同期活动-海洋能源与数字化智能化论坛成功举办  168
点击报名 | 京东2025校招进校行程预告  164
华为纯血鸿蒙正式版9月底见!但Mate 70的内情还得接着挖...  161
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!