JVM 先自增++i和后自增i++的底层原理通过字节码指令详解

JVM的组成部分

首先了解一下JVM的组成部分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9lqdkCHp-1640366554982)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211225005818470.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s8eWQb8k-1640366554985)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211225005110485.png)]

栈的组成部分

栈帧:每次调用一个方法会在栈中分配一个栈帧,栈中最多只能有一个活动栈帧,方法完全结束后会弹出栈

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ih3qtHqY-1640366554986)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211225010246599.png)]

字节码指令简介

从字节码角度分析 a++ 相关题目

iinc 指令是直接在局部变量slot上进行运算

javap java中的反编译命令

数字在-32768-32767的数字是和字节码一起存储的,其他存储在运行时常量池中,变量和方法存储也载入到运行时常量池中

字节码会放在方法区中

main方法运行,分配一个栈帧内存,local4表示局部变量表示分配了4个槽位,stack=2表示分配了深度为2的操作数栈

bipush 将一个byte类型的数压入到操作数栈

sipush 将一个short类型的数压入到操作数栈

ldc 压入的是int型

ldc2_w 压入long类型,8个字节,压入两次

istore_1 将操作数栈顶数据弹出,存入到局部变量表的slot1槽位

ldc #3将运行时常量池中#3数据压入到操作数栈

iload_1 和iload_2通过执行引擎读取局部变量表中对应的数据到操作数栈

iadd 弹出操作数栈的两个数据,并将结果存到操作数栈

istore_3 将结果从操作数栈中取出来放到局部变量表的槽位3

getstatic #4 将堆中的引用放入到操作数栈

iload_3 将局部变量表中槽位3中的结果32778读取到操作数栈中

invokevirtual #5 给方法分配一个新的栈帧

执行完毕,弹出栈帧

清除main操作数栈的内容

rerun 完成main方法调用,弹出栈帧,程序结束

题目源码:

package cn.itcast.jvm.t3.bytecode; /*** 从字节码角度分析 a++ 相关题目 */ 
public class 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

抹泪的知更鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值