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

本文深入探讨了JVM的工作原理,重点分析了字节码指令如何实现`iinc`(自增)操作,通过字节码反编译解释了`++i`和`i++`的区别,详细描述了它们在栈帧和局部变量表中的运算过程。
摘要由CSDN通过智能技术生成

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 Demo3_2 {
    public static void main(String[] args) {
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

抹泪的知更鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值