【JVM】字节码技术:图解字节码形式下的 方法执行流程

news2024/11/15 4:54:35

一、源文件

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.class
	Last modified Jul 7, 2019; size 665 bytes
	MD5 checksum a2c29a22421e218d4924d31e6990cfc5
	Compiled from "Demo3_1.java"
public class cn.itcast.jvm.t3.bytecode.Demo3_1
	minor version: 0
	major version: 52
	flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
	#1 = Methodref 			#7.#26 			// java/lang/Object."<init>":()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 				<init>
	#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 			// "<init>":()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: ()V
		flags: ACC_PUBLIC
		Code:
			stack=1, locals=1, args_size=1
				0: aload_0
				1: invokespecial #1 		// Method java/lang/Object."<init>":()V
				4: return
			LineNumberTable:
				line 6: 0
			LocalVariableTable:
				Start 		Length 		Slot 	Name 	Signature
					0 			 5 		   0 	this 	Lcn/itcast/jvm/t3/bytecode/Demo3_1;
	public static void main(java.lang.String[]);
		descriptor: ([Ljava/lang/String;)V
		flags: ACC_PUBLIC, ACC_STATIC
		Code:
			stack=2, locals=4, args_size=1
				0: bipush 10
				2: istore_1
				3: ldc #3 					// int 32768
				5: istore_2
				6: iload_1
				7: iload_2
				8: iadd
				9: istore_3
				10: getstatic #4 			// Field java/lang/System.out:Ljava/io/PrintStream;
				13: iload_3
				14: invokevirtual #5 		// Method java/io/PrintStream.println:(I)V
				17: return
			LineNumberTable:
				line 8: 0
				line 9: 3
				line 10: 6
				line 11: 10
				line 12: 17
			LocalVariableTable:
				Start 		Length 		Slot 	Name 	Signature
					0 			18 		   0 	args 	[Ljava/lang/String;
					3 			15 		   1 	   a 	I
					6 			12 		   2 	   b 	I
					10 			 8 		   3 	   c 	I
		MethodParameters:
			Name 		Flags
			args
}

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

在这里插入图片描述

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

在这里插入图片描述

五、为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 栈帧

程序结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Go语言精进之路,从新手到高手的编程思想、方法和技巧1》读书笔记和分享

Go语言精进之路&#xff0c;从新手到高手的编程思想、方法和技巧读书分享1 本书定位2 本书内容总览3 选择本书的原因4 小收获分享第7-12条 真的不知道咋命名第13-19条 能用——怎么用更好5 个人总结第一部分 熟知 Go 语言的一切第 1 条 了解 Go 语言的诞生与演进第 2 条 选择适…

甘露糖-聚乙二醇-CY5.5 /Cy5.5-PEG-mannose

甘露糖-聚乙二醇-CY5.5 /Cy5.5-PEG-mannose 中文名称&#xff1a;甘露糖-近红外染料CY5.5 英文名称&#xff1a;mannose-Cyanine5.5 别称&#xff1a;CY5.5修饰甘露糖&#xff0c;CY5.5-甘露糖 PEG分子量可选&#xff1a;350、550、750、1k、2k、34k、5k 包装&#xff1a;…

es(网站的搜索技术)

一。搜索技术 springboot集成es ElasticsearchRestTemplate mapping 继承 extends ElasticsearchRepository 实体类写的映射关系&#xff1a; 注解&#xff1a;Document用来声明Java对象与ElasticSearch索引的关系 indexName 索引名称(是字母的话必须是小…

线性回归的神经网络法——机器学习

一、算法思想 线性回归方程在神经网络深度学习中线性回归方程是需要掌握的最基础的式子&#xff0c;就是&#xff1a;ywxb,其中w,b是未知的。 神经网络就是可以通过收集大量的数据集&#xff0c;然后将这些数据集进行训练后得到几个较为准确的参数&#xff0c;训练数据集后会得…

MongoDB单机集群方案及详解

目录帮助文档MongoDB在企业级网站中的定位单机MongoDB部署集群&#xff08;副本集&#xff09;集群&#xff08;副本集仲裁&#xff09;集群&#xff08;分片&#xff09;mongo运行原理mongo管理小工具推荐帮助文档 MongoDB官方更新速度过快&#xff0c;语法不断更新&#xff…

云南民族文化旅游网页设计制作 简单静态HTML网页作品 我的家乡网页作业成品 学生旅游网站模板

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

m基于光纤光栅传感网接入GPON的光纤通信系统matlab性能仿真,包括解码,解封装,分接,码率恢复,解帧,拆包,译码

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 接入处理系统模块化设计&#xff1a; 传感器接收到的信息转换为二进制信息&#xff08;这个我们可以直接模拟出随机的二进制序列来表示传感器的数据&#xff0c;首先设置一组数据&#…

maven学习: 使用Maven构建Web项目

5.1 Maven中Web项目的结构 ​ 在java的世界中&#xff0c;Web应用占有很大的地位&#xff0c;而它的标准打包方式是WAR。WAR与JAR类似&#xff0c;但它包含了更多内容&#xff0c;如JSP文件、Servlet、web.xml配置文件、静态web资源&#xff08;如html&#xff0c;css&#xf…

Python Gui之tkinter

GUI是什么 目录 1。GUI编程的核心步骤和第一个GUI程序 2.tkinter主窗口​​​​​​​ 3.GUI的整体描述 常用组件汇总 4.简单的组件 1.Label标签 2.Options选项详解 3.Button 4.Entry单行文本框 5.Text多行文本框 1。GUI编程的核心步骤和第一个GUI程序 from tkinte…

biaffine model:Named Entity Recognition as Dependency Parsing

论文名称&#xff1a;Named Entity Recognition as Dependency Parsing 论文地址&#xff1a;https://www.aclweb.org/anthology/2020.acl-main.577/ 前提说明 本文主要参考了以下资料 nlp_paper_study_information_extraction/code_pytorch.md at main km1994/nlp_paper_s…

ASEMI肖特基二极管SBT40100VFCT规格,SBT40100VFCT封装

编辑-Z ASEMI肖特基二极管SBT40100VFCT参数&#xff1a; 型号&#xff1a;SBT40100VFCT 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;100V 最大平均正向整流输出电流&#xff08;IF&#xff09;&#xff1a;40A 峰值正向浪涌电流&#xff08;IFSM&#…

使用kubeadm搭建高可用集群-k8s相关组件及1.16版本的安装部署

本文是向大家分享k8s相关组件及1.16版本的安装部署&#xff0c;它能够让大家初步了解k8s核心组件的原理及k8s的相关优势&#xff0c;有兴趣的同学可以部署安装下。 什么是kubernetes kubernetes是Google 开源的容器集群管理系统&#xff0c;是大规模容器应用编排系统&#xff…

ubuntu下jupyter notebook设置远程访问

1. 安装anaconda 推荐安装anaconda&#xff0c;安装后就会包含jupyter notebook 使用命令conda list或者pip list查看jupyter notebook包&#xff0c;这里不多介绍 2. 生成默认配置文件 在ubuntu环境下&#xff0c;安装jupyter notebook后&#xff0c;用户主目录中会有一个…

DRU-Net--一种用于医学图像分割的高效深度卷积神经网络

Title:DRU-NET: AN EFFICIENT DEEP CONVOLUTIONAL NEURAL NETWORK FOR MEDICAL IMAGE SEGMENTATION 摘要 本文的网络结构是受ResNet和DenseNet两个网络的启发而提出的。与ResNet相比本文的方法增加了额外的跳跃连接&#xff0c;但使用的模型参数要比DenseNet少的多。 基于先…

【创建型设计模式-单例模式】一文搞懂单例模式的使用场景及代码实现的7种方式(全)

1.什么是单例模式 在了解单例模式前&#xff0c;我们先来看一下它的定义&#xff1a; 确保一个类只有一个实例&#xff0c;而且自行实例化并且自行向整个系统提供这个实例&#xff0c;这个类称为单例类&#xff0c;它提供全局访问的方法&#xff0c; 单例模式是一种对象的创建型…

北京东物流,南顺丰速运

配图来自Canva可画 众所周知&#xff0c;“双11”是一年一度的物流高峰期&#xff0c;但2022年“双11”当日快递业务量并未达到预期水平&#xff0c;全年增速创下新低。据了解&#xff0c;“双11”当日业务量为5.52亿件&#xff0c;同比下滑了20.69%&#xff0c;而11月1日至11…

什么是CISAW认证?有什么价值?

随着信息技术的快速发展和信息化应用的不断深入&#xff0c;信息技术、产品及网络已经融入社会经济生活的方方面面&#xff0c;但同时信息安全问题也越来越突出。面对严峻的信息安全形势&#xff0c;我国将信息安全上升至国家战略&#xff0c;相继出台了一系列政策法规。那大家…

IDEA好用插件推荐

一、MavenHelper 当Maven Helper 插件安装成功后&#xff0c;打开项目中的pom文件&#xff0c;下面就会多出一个试图Dependency Analyzer 切换到此试图即可进行相应操作&#xff1a; Conflicts&#xff08;查看冲突&#xff09;All Dependencies as List&#xff08;列表形式…

数据仓库规范

模型设计 模型设计概述 为什么需要模型设计&#xff1f; Linux 的创始人 Torvalds 有 一段关于“什么才是优秀程序员”的话:“烂程序员关心的是代码&#xff0c;好程序员关心的是数据结构和它们之间的关系”&#xff0c;其阐述了数据模型的重要性。有了适合业务和基础数据存…

python 中__init__ 作用

__init__的作用&#xff1a; &#xff08;1&#xff09;声明包 &#xff08;2&#xff09;预加载模块内容 &#xff08;1&#xff09;声明包 python项目结构中&#xff0c;普通目录下无__init__文件&#xff1b;而包下是有__init__文件的。 python 项目结构是按目录来组织的…