ldc java_Java进阶干货分享:深入JVM指令手册(一)

JVM在Java进阶中有多重要,相信每一位学习Java的同学都了解,上篇内容说到了JVM内存模型详解,还是有同学留言说挺实用的。

昨天,在交流群里和大佬们交流的时候,发现现在学到jvm这块进阶内容的时候,很多人对指令手册不是很了解。

还被大佬们调侃,因为这也是我当初学进阶课程时,jvm版块的一个难点,也是群里的大佬们协助解决的。

所以,今天就来和大家说一下这块的内容,主要分为三篇文章来和大家说,有兴趣的小伙伴可以持续关注。想学习大佬们经验或者想向大佬们请教的,我这边也给到大家方法,大家自行获取。cfe67e82f3e1f5d47b7b0c95390af898.png

一、未归类系列A

此系列暂未归类。

二、const系列

该系列命令主要负责把简单的数值类型送到栈顶。该系列命令不带参数。注意只把简单的数值类型送到栈 顶时,才使用如下的命令。

比如对应int型才该方式只能把-1,0,1,2,3,4,5(分别采用iconst_m1,iconst_0, iconst_1, iconst_2, iconst_3, iconst_4, iconst_5)

送到栈顶。对于int型,其他的数值请使用push系列命令(比如bipush)。

三、push系列

该系列命令负责把一个整形数字(长度比较小)送到到栈顶。该系列命令有一个参数,用于指定要送到栈顶的数字。

注意该系列命令只能操作一定范围内的整形数值,超出该范围的使用将使用ldc 命令系列。

四、ldc系列

该系列命令负责把数值常量或String常量值从常量池中推送至栈顶。该命令后面需要给一个表示常量在常量池中位置(编号)的参数,

哪些常量是放在常量池呢?比如:final static int id=32768;final static float double=6.5。

对于const系列命令和push系列命令操作范围之外的数值类型常量,都放在常量池中.

另外,所有不是通过new创建的String都是放在常量池中的。

五、load系列

5.1、load系列A

该系列命令负责把本地变量的送到栈顶。这里的本地变量不仅可以是数值类型, 还可以是引用类型。

对于前四个本地变量可以采用iload_0,iload_1,iload_2,iload_3(它们分别表示第0,1,2,3个整形变量)这种不到参数的简化命令形式。

对于第4以上的本地变量将使用iload命令这种形式,在它后面给一参数,以表示是对第几个(从0开始)本类型的本地变量进行操作。

对本地变量所进行的编号,是对所有类型的本地变量进行的(并不按照类型分类)。

对于非静态函数,第一变量是this,即其对于的操作是aload_0.

还有函数传入参数也算本地变量,在进行编号时,它是先于函数体的本地变量的。

5.2、load系列B

该系列命令负责把数组的某项送到栈顶。该命令根据栈里内容来确定对哪个数组的哪项进行操作。

比如,如果有成员变量:final String names[]={"robin","hb"};

那么这句话:String str=names[0];对应的指令为

六、store系列

6.1、store系列A

该系列命令负责把栈顶的值存入本地变量。这里的本地变量不仅可以是数值类型,还可以是引用类型。

如果是把栈顶的值存入到前四个本地变量的话,采用的是istore_0,istore_1, istore_2,istore_3(它们分别表示第0,1,2,3个本地整形变量)这种不到参数的简 化命令形式。如果是把栈顶的值存入到第四个以上本地变量的话,将使用istore 命令这种形式,在它后面给一参数,以表示是把栈顶的值存入到第几个(从0开 始)本地变量中。

对本地变量所进行的编号,是对所有类型的本地变量进行的(并不按照类型分类)。

对于非静态函数,第一变量是this,它是只读的.

还有函数传入参数也算本地变量,在进行编号时,它是先于函数体的本地变量的。

6.2、store系列B

该系列命令负责把栈顶项的值存到数组里。该命令根据栈里内容来确定对哪个数组的哪项进行操作。

比如,如下代码:

int moneys[]=new int[5];

moneys[1]=100;

其对应的指令为:

49:iconst_5

50:newarray int

52:astore11

54:aload11

56:iconst_1

57:bipush100

59:iastore

60:lload6//因为str在我的程序中是其所非静态在函数的第6个变量(从0开始计数).

七、pop系列

该系列命令似乎只是简单对栈顶进行操作,更多详情待补充。

八、栈顶元素数学操作及移位操作系列

该系列命令用于对栈顶元素行数学操作,和对数值进行移位操作。移位操作的操作数和要移位的数都是从栈里取得。

比如对于代码:int k=100;k=k>>1;其对应的JVM指令为:

60:bipush100

62:istore12//因为k在我的程序中是其所在非静态函数的第12个变量(从0开始计数).

64:iload12

66:iconst_1

67:ishr

68:istore12

关于JVM指令手册内容将分为3篇文章给大家,有需要的可以持续关注,我这边也有关于进阶的大佬交流群,任何关于Java相关的内容都可以在群内咨询,大佬们都会积极解决。cfe67e82f3e1f5d47b7b0c95390af898.png

很多人在学习Java的过程中会忽略这一块的知识,如果想要通过进阶获得高薪酬的工作,肯定是各个内容都需要掌握,希望这篇文章能够帮助到大家。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值