【JVM篇】分析并讲解字节码文件

文章目录

  • 🍔字节码文件
    • ⭐打开字节码文件的工具
    • ⭐字节码文件的组成
    • ✨具体分析

在这里插入图片描述

🍔字节码文件

字节码文件是一种中间表示形式,它通常由编译器将高级编程语言(如Java、Python等)源代码编译而成。字节码文件包含了程序的指令集,可以被解释器或虚拟机读取和执行。

对于Java语言而言,编译Java源代码后会生成字节码文件(以.class为扩展名),其中包含了Java虚拟机(JVM)可理解的指令集。字节码文件可以在不同的平台上运行,因为它们是跨平台的中间表示形式。JVM会将字节码文件加载到内存中,并逐条解释执行其中的指令。

字节码文件具有以下特点:

  • 它是一种中间表示形式,介于源代码和机器码之间。
  • 字节码文件可以在不同的平台上执行(需要安装相应的虚拟机)。
  • 它是面向对象编程语言(如Java)的典型编译结果。
  • 字节码文件可以进行优化和加密,以提高执行效率和保护代码安全性。

通过将源代码编译成字节码文件,可以实现代码的平台无关性,并提供更高层次的安全性和运行时的灵活性。

⭐打开字节码文件的工具

推荐使用jclasslib工具来查看字节码文件

官网:https://github.com/ingokegel/jclasslib/releases

下载下来进行安装即可
在这里插入图片描述

⭐字节码文件的组成

请添加图片描述

Java字节码文件的组成包括:

  • 魔数(Magic Number):4个字节,用于标识此文件是否是一个合法的字节码文件。

请添加图片描述

  • 版本号(Version Number):2个字节,用于指定字节码文件的版本号。高版本的JVM可能不支持低版本的字节码文件。

请添加图片描述

  • 常量池(Constant Pool):变长的数据结构,存储各种字面量和符号引用。包括类名、字段名、方法名、接口名、字符串常量等。
    请添加图片描述

  • 访问标志(Access Flags):2个字节,用于表示类或者接口的访问属性,如public、final、abstract等。

  • 类索引、父类索引和接口索引集合:各2个字节,用于描述类的继承关系和实现的接口。

  • 字段表集合(Field Table):变长的数据结构,用于描述类中定义的所有字段。

  • 方法表集合(Method Table):变长的数据结构,用于描述类中定义的所有方法。

请添加图片描述

请添加图片描述

请添加图片描述

  • 属性表集合(Attribute Table):变长的数据结构,用于描述类的附加信息,包括源代码文件名、注解等。

其中,常量池是字节码文件中最重要的部分之一,它包含了几乎所有的字面量和符号引用,并为虚拟机执行字节码提供了必要的信息。字段表集合和方法表集合则描述了类中定义的所有属性和方法,包括访问修饰符、名称和描述符等信息。属性表集合用于描述类的附加信息,如源代码文件名、注解等。

通过这些部分的组合,Java虚拟机可以读取和执行字节码文件中的指令,并最终完成程序的执行。

✨具体分析

我们分析一下下面这段代码的jvm执行过程

package org.example;

public class Demo1 {
    public static void main(String[] args) {
        int i=0;
        int j=i+1;
    }
}

在这里插入图片描述

首先找到字节码文件

在这里插入图片描述

使用上面提到的工具打开

在这里插入图片描述

下面我们来分析执行过程

  1. iconst_0:将常量值0压入操作数栈顶。此时操作数栈:[0]。
  2. istore_1:将操作数栈顶的值(0)存储到本地变量表中索引为1的位置(即变量 i )。此时本地变量表:[0, 0]。
  3. iload_1:将本地变量表中索引为1的值(即变量i的值)压入操作数栈顶。此时操作数栈:[0]。
  4. iconst_1:将常量值1压入操作数栈顶。此时操作数栈:[0, 1]。
  5. iadd:从操作数栈中弹出两个值(0和1),执行加法操作,并将结果(1)压入操作数栈顶。此时操作数栈:[1]。
  6. istore_2:将操作数栈顶的值(1)存储到本地变量表中索引为2的位置(即变量j)。此时本地变量表:[0, 0, 1]。
  7. return:方法执行完毕,返回。

在执行过程中,代码中定义的变量i和j分别被存储在本地变量表的索引1和索引2处。通过字节码指令对操作数栈和本地变量表的读写操作,实现了变量的赋值和运算。最终,方法执行完毕并返回。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux第50步_移植ST公司的linux内核第2步_编译ST公司的linux源码和修改网络驱动

1、修改“linux-5.4.31”目录下的“Makefile” 1)、使用VSCode打开“linux-5.4.31.code-workspace” 2)、点击“linux-5.4.31”目录下的“Makefile” 3)、点击“编辑”,点击“查找”,输入“CROSS_COMPILE回车”,找到“ARCH ? $(SUBARCH)”…

SpringCloud-高级篇(二十二)

前面解决了消息的可靠性、消息的延迟问题,消息的堆积的问题,下面研究mq可用性、并发能力问题,这就需要mq集群来实现了 一:集群分类 (1)普通集群 创建一个节点: 8082、8083也可以看到这个队列&…

Qt可视化大屏布局

科技大屏现在非常流行,这里分享一下某个项目的大屏布局(忘了源码是哪个博主的了) 展示 这个界面整体是垂直布局,分为两个部分,标题是一个部分,然后下面的整体是一个layout布局,为另外一部分。 l…

委托和事件详解

委托和事件详解 前言一、委托1.什么是委托2.委托的声明3.Action<T>委托和Func<T>委托4.委托的缺点5.委托与lambda表达式6.委托的使用&#xff08;1&#xff09;模板方法&#xff08;2&#xff09;回调方法 二、事件1.什么是事件2.事件模型的5个步骤和组成部分&…

UE5 播放本地MP3、MP4

1.创建一个媒体播放器 2.如创建视频&#xff0c;勾选。 它会多一个媒体纹理给你 3.1 设置音频 在一个actor上添加“媒体音频组件” “音频媒体播放器”赋值给它 3.2播放音频 添加一个音频媒体播放器变量&#xff0c; 赋值 地址使用绝对地址 4.1设置视频 UI上创建一个imag…

Linux第49步_移植ST公司的linux内核第1步_获取linux源码

已知ST公司的linux源码路径&#xff1a; /home/zgq/linux/atk-mp1/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.31-r0 1、创建“my_linux”目录 打开第1个终端 输入“ls回车” 输入“cd linux/回车”&#xff0c;切换…

C语言每日一题(55)另一颗树的子树

力扣 572 另一棵树的子树 题目描述 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所…

C#,最大公共子序列(LCS,Longest Common Subsequences)的算法与源代码

1 最大公共子序列 最长的常见子序列问题是寻找两个给定字符串中存在的最长序列。 最大公共子序列算法&#xff0c;常用于犯罪鉴定、亲子鉴定等等的 DNA 比对。 1.1 子序列 让我们考虑一个序列S<s1&#xff0c;s2&#xff0c;s3&#xff0c;s4&#xff0c;…&#xff0c;…

python+django学习交流论坛系统244t6

系统可以提供信息显示和相应服务&#xff0c;其管理员管理用户发布的博客文章以及用户之间的论坛交流信息&#xff0c;管理留言以及文章分类信息。用户在论坛交流模块发布帖子以及评论帖子&#xff0c;在前台查看和评论其他用户发布的博客文章&#xff0c;收藏博客文章&#xf…

给定具体日期 返回给定日期是星期几 calendar.weekday(year,month,day)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 给定具体日期 返回给定日期是星期几 calendar.weekday(year,month,day) [太阳]选择题 如果2024年2月12日是星期一&#xff0c;请问最后一个print语句的运行结果是&#xff1f; import calenda…

ubuntu远程桌面配置以及常见问题

ubuntu桌面系统配置 ubuntu远程桌面配置如下 第一步&#xff0c;安装xrdp sudo apt-get isntall xrdp安装完检查一下服务是否可以正常启动&#xff0c; sudo systemctl status xrdp如果看到active应该就正常启动了 第二步&#xff0c;开启Ubuntu桌面共享 好接下来我们测试一…

【玩转408数据结构】线性表——线性表的顺序表示(顺序表)

知识回顾 通过前文&#xff0c;我们了解到线性表是具有相同数据类型的有限个数据元素序列&#xff1b;并且&#xff0c;线性表只是一种逻辑结构&#xff0c;其不同存储形式所展现出的也略有不同&#xff0c;那么今天我们来了解一下线性表的顺序存储——顺序表。 顺序表的定义 …

Linux:信号的处理

文章目录 信号处理 本篇总结的是关于信号的处理 信号处理 在之前有这样的观点&#xff1a;信号在合适的时候被处理好&#xff0c;当进程收到信号后&#xff0c;当前进程可能在做优先级更高的事&#xff0c;所以它来不及处理这个信号&#xff0c;那么就会把这个信号暂时保存起…

Apache 神禹(shenyu)源码阅读(一)——Admin向Gateway的数据同步(Admin端)

源码版本&#xff1a;2.6.1 单机源码启动项目 启动教程&#xff1a;社区新人开发者启动及开发防踩坑指南 源码阅读 前言 开了个新坑&#xff0c;也是第一次阅读大型项目源码&#xff0c;写文章记录。 在写文章前&#xff0c;已经跑了 Divide 插件体验了一下&#xff08;体…

SpringCloud-项目引入Nacos

一、安装Nacos服务 首先&#xff0c;我们需要从 Nacos 的官方网站下载发布版本。下载地址&#xff1a;Releases alibaba/nacos GitHub 选择合适的版本并下载&#xff0c;解压缩得到 Nacos 的安装包。 在解压后的 Nacos 目录中&#xff0c;找到 bin 文件夹。 用写字板编辑…

python学习23

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

Centos7离线安装MySQL5.7

卸载mariadb rpm -e --nodeps mariadb-libs可以使用rpm -qa|grep mariadb命令检测是否卸载完成。 关闭selinux 将/etc/selinux/config文件中的SELINUX设置为disabled下载MySql的相关rpm包 打开https://dev.mysql.com/downloads/mysql/ 选择Red Hat Enterprise Linux / Oracle L…

Codeforces Round 924 E. Modular Sequence

E. Modular Sequence 题意 对于一个长度为 n n n 的数组 a a a&#xff0c;定义它是 g o o d good good 的当且仅当&#xff1a; a 1 x a_1 x a1​x a i a i − 1 y a_{i} a_{i - 1} y ai​ai−1​y 或 a i a i − 1 m o d y i ≥ 2 a_{i} a_{i - 1} mod \hspace{…

kali最新最简单安装

之前都是用iso镜像文件的 今年好多东西都删库了&#xff0c;所有还是要主要资源的保存 去官网找下载 一般来说都是用虚拟机的 下载完会是一个压缩文件&#xff0c; 解压&#xff0c;然后操作之前需要先下载虚拟机 打开方式用虚拟机打开 kali就按装好了

【Java EE初阶十二】网络编程TCP/IP协议(一)

1. 网络编程 通过网络&#xff0c;让两个主机之间能够进行通信->就这样的通信来完成一定的功能&#xff0c;进行网络编程的时候&#xff0c;需要操作系统给咱们提供一组API&#xff0c;通过这些API来完成编程&#xff1b;API可以认为是应用层和传输层之间交互的路径&#xf…
最新文章