发表时间:2022-03-25来源:网络
在读本文时,可以参考我的另外两篇介绍jvm的博客。
JVM底层结构
Java堆内存介绍及简单性能调优
首先我们编写一个简单的Java文件
在文件夹中找到这个文件,可以看到只有一个.java 文件
在命令行使用Javac命令,生成.class文件
使用Javap -c命令,生成字节码文件

看到这个乱七八糟的代码,你可能会问,,这tm是什么鬼。
下面通过JVM指令手册从Java底层对字节码进行分析

iconst_1:将int型常量①压入操作数栈
istore_2:将int类型的值存入局部变量①
结合JVM虚拟机内存结构图
首先,给常量a在操作数栈中分配一个内存空间,即iconst_1对应int a
然后,把常量a的值变成1,并存进局部变量表,即istore_2对应a=1
iconst_2:将int型常量②压入操作数栈
istore_2:将int类型的值存入局部变量②
同理,很容易理解
iload_1:从局部变量①中转载int类型值 即a的值1
iload_2:从局部变量②中装载int类型值 即b的值2
即把变量a的值1给装载出来,放在操作数栈
把变量b的值2给装载出来,放在操作数栈
iadd:执行int类型的加法
即从操作数栈中依次弹出栈顶元素相加,最终生成的结果压回操作数栈 a+b
最后 ireturn:从当前方法返回int
从操作数栈中弹出3
即对应 return 3

new:创建一个对象
我们对比上面的 int a 可以知道,new出来的test 也是一个局部变量,它被存放在main方法对应的栈帧内存区的局部变量表中,
但在jvm底层,对象创建之后放在堆中,
这样我们就可以发现栈和堆之间的一个联系。
那么,这两个东西真的就是一样的嘛?
其实,局部变量表中存放的是堆中对象对应的内存地址,即可以理解为它存放一个指向堆中对象的指针。
到这里,我们就可以通过字节码在jvm底层结构理解整个Java代码的执行过程。
最后还有一个问题


在执行main方法时,会跳出去转到computer方法中,在执行完computer方法后,它会再回到main方法中,但是,它回到哪了呢?
方法出口就记录着返回的位置。
同样,程序计数器?
它记录着程序执行的位置,即行数
设想,在Java代码执行时,经常会有多个线程。学过操作系统的就知道,cpu在运行时,经常会发生线程被抢占,被执行的线程挂起。那么,这个线程被挂起之后,它重新运行时,从哪开始呢?
程序计数器就解决了这个问题。
下一篇:编写高效优雅 Java 程序
计支宝app下载v3.1.29 安卓版
142.27MB |商务办公
小小优酷最新版下载v5.4.6 安卓官方版
68.11MB |影音播放
艺图语app下载v3.3.4 安卓免费版
34.33MB |系统工具
爱鸽者手机版下载v3.2.9 安卓版
243.57MB |商务办公
一品威客网接单app(一品众包)下载v2.7.1 安卓最新版
55.01MB |商务办公
诸葛找房网官方版下载v4.8.1.1 安卓最新版
66.6MB |生活服务
皓盘云建最新版下载v9.0 安卓版
53.38MB |商务办公
ris云客移动销售系统最新版下载v1.1.25 安卓手机版
42.71M |商务办公
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-02-15
2022-02-14
葫芦侠三楼最新破解版下载v4.4.0.6 安卓版
其它手游葫芦侠7楼破解版免费下载v4.4.0.6安卓最新版
其它手游葫芦侠八楼免费版下载v4.4.0.6安卓版
其它手游葫芦侠3楼破解版免费下载v4.4.0.6安卓手机版
其它手游像素漫斗抱歉,“八神庵”是特指游戏角色的专有名词,不存在符合要求的常用同义词近义词。下载v1.00安卓版
其它手游葫芦侠4楼破解版游戏修改器下载v4.4.0.6安卓免费版
其它手游末日餐厅安卓版下载v1.35安卓版
其它手游葫芦侠十楼免费破解版下载v4.4.0.6安卓版
其它手游葫芦侠8楼最新破解版下载v4.4.0.6安卓版
其它手游