【JVM】字节码技术:图解字节码形式下的 方法执行流程
创始人
2024-02-12 03:11:07
0

一、源文件

package cn.itcast.jvm.t3.bytecode;/**
* 演示 字节码指令 和 操作数栈、常量池的关系
*/
public class Demo3_1 {public static void main(String[] args) {int a = 10;int b = Short.MAX_VALUE + 1;int c = a + b;System.out.println(c);}
}

二、反编译的字节码文件

[root@localhost ~]# javap -v Demo3_1.class
Classfile /root/Demo3_1.classLast modified Jul 7, 2019; size 665 bytesMD5 checksum a2c29a22421e218d4924d31e6990cfc5Compiled from "Demo3_1.java"
public class cn.itcast.jvm.t3.bytecode.Demo3_1minor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER
Constant pool:#1 = Methodref 			#7.#26 			// java/lang/Object."":()V#2 = Class 				#27 			// java/lang/Short#3 = Integer 32768#4 = Fieldref 			#28.#29 		//java/lang/System.out:Ljava/io/PrintStream;#5 = Methodref 			#30.#31 		// java/io/PrintStream.println:(I)V#6 = Class 				#32 			// cn/itcast/jvm/t3/bytecode/Demo3_1#7 = Class 				#33 			// java/lang/Object#8 = Utf8 				#9 = Utf8 				()V#10 = Utf8 				Code#11 = Utf8 				LineNumberTable#12 = Utf8 				LocalVariableTable#13 = Utf8 				this#14 = Utf8 				Lcn/itcast/jvm/t3/bytecode/Demo3_1;#15 = Utf8 				main#16 = Utf8 				([Ljava/lang/String;)V#17 = Utf8 				args#18 = Utf8 				[Ljava/lang/String;#19 = Utf8 				a#20 = Utf8 				I#21 = Utf8 				b#22 = Utf8 				c#23 = Utf8 				MethodParameters#24 = Utf8 				SourceFile#25 = Utf8 				Demo3_1.java#26 = NameAndType 		#8:#9 			// "":()V#27 = Utf8 				java/lang/Short#28 = Class 			#34 			// java/lang/System#29 = NameAndType 		#35:#36 		// out:Ljava/io/PrintStream;#30 = Class 			#37 			// java/io/PrintStream#31 = NameAndType 		#38:#39 		// println:(I)V#32 = Utf8 				cn/itcast/jvm/t3/bytecode/Demo3_1#33 = Utf8 				java/lang/Object#34 = Utf8 				java/lang/System#35 = Utf8 				out#36 = Utf8 				Ljava/io/PrintStream;#37 = Utf8 				java/io/PrintStream#38 = Utf8 				println#39 = Utf8 				(I)V
{public cn.itcast.jvm.t3.bytecode.Demo3_1();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1 		// Method java/lang/Object."":()V4: returnLineNumberTable:line 6: 0LocalVariableTable:Start 		Length 		Slot 	Name 	Signature0 			 5 		   0 	this 	Lcn/itcast/jvm/t3/bytecode/Demo3_1;public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=4, args_size=10: bipush 102: istore_13: ldc #3 					// int 327685: istore_26: iload_17: iload_28: iadd9: istore_310: getstatic #4 			// Field java/lang/System.out:Ljava/io/PrintStream;13: iload_314: invokevirtual #5 		// Method java/io/PrintStream.println:(I)V17: returnLineNumberTable:line 8: 0line 9: 3line 10: 6line 11: 10line 12: 17LocalVariableTable:Start 		Length 		Slot 	Name 	Signature0 			18 		   0 	args 	[Ljava/lang/String;3 			15 		   1 	   a 	I6 			12 		   2 	   b 	I10 			 8 		   3 	   c 	IMethodParameters:Name 		Flagsargs
}

三、常量池载入运行时常量池

在这里插入图片描述

四、方法字节码载入方法区

在这里插入图片描述

五、为main线程分配栈帧内存

(stack=2,locals=4)

在这里插入图片描述

六、int a=10;

1)bipush 10

将一个 byte 压入操作数栈(其长度会补齐 4 个字节),类似的指令还有:

  • sipush:将一个 short 压入操作数栈(其长度会补齐 4 个字节)
  • ldc:将一个 int 压入操作数栈
  • ldc2_w:将一个 long 压入操作数栈(分两次压入,因为 long 是 8 个字节)
  • 这里小的数字都是和字节码指令存在一起,超过 short 范围的数字存入了常量池

在这里插入图片描述

2)istore_1

将操作数栈顶数据弹出,存入局部变量表的 slot 1

在这里插入图片描述

在这里插入图片描述

七、int b=Short.MAX_VALUE+1;

3)ldc #3

从常量池加载 #3 数据到操作数栈

注意:Short.MAX_VALUE 是 32767,所以 32768 = Short.MAX_VALUE + 1 实际是在编译期间计算 好的

在这里插入图片描述

4)istore_2

在这里插入图片描述

在这里插入图片描述

八、int c=a+b;

5)iload_1

在这里插入图片描述

6)iload_2

在这里插入图片描述

7)iadd

在这里插入图片描述

在这里插入图片描述

8)istore_3

在这里插入图片描述

在这里插入图片描述

九、System.out.println©

9)getstatic #4

在这里插入图片描述

在这里插入图片描述

10)iload_3

在这里插入图片描述

在这里插入图片描述

11)invokevirtual #5

找到常量池 #5

定位到方法区 java/io/PrintStream.println:(I)V 方法

生成新的栈帧(分配 locals、stack等)

传递参数,执行新栈帧中的字节码

在这里插入图片描述

执行完毕,弹出栈帧

清除 main 操作数栈内容

在这里插入图片描述

十、返回

12)return

完成 main 方法调用,弹出 main 栈帧

程序结束

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...