【JVM】字节码文件的组成部分

news2024/12/28 3:36:32

在这里插入图片描述

🐌个人主页: 🐌 叶落闲庭
💨我的专栏:💨
c语言
数据结构
javaEE
操作系统
Redis

石可破也,而不可夺坚;丹可磨也,而不可夺赤。


JVM

  • 一、字节码文件的组成部分
    • 1.1 iconst_0
    • 1.2 istore_1
    • 1.3 iload_1
    • 1.4 iconst_1
    • 1.5 iadd
    • 1.6 istore_2
    • 1.7 return
  • 二、执行i++ 操作
    • 2.1 iconst_0
    • 2.2 istore_1
    • 2.3 iinc 1 by 1
    • 2.4 return
  • 三、字节码常用工具:javap -v命令

一、字节码文件的组成部分

  • 操作数栈是临时存放数据的地方
  • 局部变量表是存放方法中的局部变量的位置

观察如下代码的字节码文件

int i = 0;
int j = i + 1;

具体的java源代码:

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

要想看到java的字节码文件的内容,可以通过jclasslib这个工具来看,运行以上代码,然后通过jclasslib可以看到在这个方法中变量的存放位置,其中,局部变量表数组的0索引位置存放的是main方法的参数 args ,1索引位置存放的是第一个变量 i ,2索引存放的是第二个变量 j ,可以看出,定义在方法中的变量,方法的参数也将作为这个方法的变量存入局部变量表中,定义在方法内的变量会按定义的先后顺序依次存入局部变量表中。

在这里插入图片描述

接下来解析这段代码的字节码文件:

  • iconst_0:将常量0放入到操作数栈中
  • istore_1:将操作数栈中的值取出放入局部变量表索引为1的位置
  • iload_1:将局部变量表索引为1的位置的值复制一份放入到操作数栈中
  • iconst_1:将常量1放入到操作数栈中
  • iadd:将操作数栈中最上面的两个值相加,并把结果存放在栈中
  • istore_2:将操作数栈中的值取出放入局部变量表索引为2的位置
  • return:方法结束,返回

1.1 iconst_0


在这里插入图片描述


1.2 istore_1


在这里插入图片描述


1.3 iload_1


在这里插入图片描述


1.4 iconst_1


在这里插入图片描述


1.5 iadd


在这里插入图片描述


1.6 istore_2


在这里插入图片描述


1.7 return

在这里插入图片描述


二、执行i++ 操作

  • 源代码:
public static void main(String[] args) {
    int i = 0;
    i++;
}
  • 字节码:
  • iconst_0:将常量0放入操作数栈中

  • istore_1:将操作数栈中的值取出放入索引为1的局部变量表中

  • iinc 1 by 1:在局部变量表索引为1的位置增加1

  • return:方法结束,返回

2.1 iconst_0


在这里插入图片描述


2.2 istore_1


在这里插入图片描述


2.3 iinc 1 by 1

根据JVM规范,iinc就是通过一个常量递增局部变量


在这里插入图片描述


2.4 return


在这里插入图片描述


三、字节码常用工具:javap -v命令

javap是JDK自带的反编译工具,可以通过控制台查看字节码文件的内容。
适合在服务器上查看字节码文件内容。
直接输入javap查看所有参数。
输入javap-v字节码文件名称查看具体的字节码信息。(如果jar包需要先使用jar-vf命令解压)

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

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

相关文章

LabVIEW开发TDS1000 和TDS2000 系列泰克示波器

LabVIEW开发TDS1000 和TDS2000 系列泰克示波器 泰克示波器是经常用到的工具,一般手动操作即可,但有时候也要集成到系统中,需要程控。这时候先要下载厂家提供的例子,了解LabVIEW的demo。根据不用的示波器型号,选择和计…

在职场上有多少人输在了不会用Python数据分析

在职场上有多少人输在了不会用Python数据分析 在职场上有多少人输在了不会用Python数据分析引言方向一:学了Python能做什么?方向二:Python的应用领域1. Web开发:2. 自动化和脚本编写:3. 数据科学和分析:4. …

锐捷RG-UAC账号密码信息泄露

第一种方法: 构造如下Payloads https://xxxxx/get_dkey.php?useradmin访问payload成功后,可以看到受影响系统的超级管理员权限账号、访客权限账号、审计权限账号的账户名和 MD5 加密的密码值,如下图所示: 下面可以使用上一步查…

【强化学习】10 —— DQN算法

文章目录 深度强化学习价值和策略近似RL与DL结合产生的问题深度强化学习的分类 Q-learning回顾深度Q网络(DQN)经验回放优先经验回放 目标网络算法流程 代码实践CartPole环境代码结果 参考 深度强化学习 价值和策略近似 我们可以利用深度神经网络建立这些…

缺少d3dx9_43.dll怎么解决 win系统如何运行dll文件?

大家好!今天我来给大家分享一下关于d3dx9_43.dll缺失的4种详细解决方案。 首先,让我们了解一下d3dx9_43.dll是什么文件。其实,d3dx9_43.dll是DirectX的一个组件,它主要负责处理游戏中的一些特效和动画效果。如果这个文件丢失了&a…

MacOS系统电脑怎么彻底清理系统垃圾注册表App Cleaner可以深度清理吗

App Cleaner & Uninstaller 是一款适用于 Mac 操作系统的软件应用程序,允许用户轻松卸载不需要的应用程序、删除剩余文件和文件夹以及管理启动项。该应用程序会分析与您要删除的应用程序关联的文件,并帮助识别其所有组件,以便您可以一次将…

C++学习day--23 枚举、类型定义、头文件

1、枚举 1.1 枚举的概念 枚举是 C/C 语言中的一种基本数据类型, 它可以用于声明一组常数 。当一个变量有几个固 定的可能取值时,可以将这个变量定义为枚举类型。 比如,你可以用一个枚举类型的变量来表示季节,因为季节只有 4 …

C++之左值、右值、std::forward、std::move总结(二百五十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

033-第三代软件开发-固定区域截图

第三代软件开发-固定区域截图 文章目录 第三代软件开发-固定区域截图项目介绍固定区域截图QWidget 版本QML 版本 自由截图自由截图二 关键字: Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QM…

粤嵌实训医疗项目--day03(Vue + SpringBoot)

往期回顾 粤嵌实训医疗项目day02(Vue SpringBoot)-CSDN博客 粤嵌实训医疗项目--day01(VueSpringBoot)-CSDN博客 目录 一、SpringBoot AOP的使用 二、用户模块-注册功能(文件上传) 三、用户模块-注册实现…

基于stm32的ADC读取烟雾报警器的数值

本文想要设计一个设计一个有stm32控制的烟雾报警系统。通过MQ-2烟雾报警器将获取模拟的数值传递给stm32的ADC外设并在串口助手上显示对应的电压值。烟雾报警器浓度越高,他的电压就越高,但是不会超过3.3V。设置一个电压临界值,当传输回来的电压…

Python环境下LaTeX数学公式转图像方案调研与探讨

目录 引言方案一:基于LaTeX环境方案二:基于KaTeX(推荐) 方案三:基于Matplotlib写在最后 引言 近来,涉及到一些公式识别的项目,输入是公式的图像,输出是LaTeX格式的数学公式字符串。 这类项目一般都采用深…

小程序如何设置首选配送公司

小程序的一个重要环节就是配送服务。为了提供更好的发货体验,避免商家总是要在众多的配送公司中选择想要,小程序支持设置首选配送。下面将具体介绍一下小程序如何设置。 在小程序管理员后台->配送设置->首选配送处,指定需要设置的首选…

如何使用gpt提高效率

如何使用gpt提高效率 自动化替代人力工作减少创意工作需求技术依赖风险实际应用领域内容生成自动回答问题自动化编程个性化推荐 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 《java 面试题大全》 🍩惟余辈才疏学浅&…

Linux进程控制(一)

前言:Linux进程控制是指在Linux操作系统中,对进程的创建、运行、管理和终止等方面进行控制的一系列机制和技术。Linux作为一个多任务操作系统,能够同时运行多个进程任务的执行,继前面我们对Linux进程创建的学习之后,今…

【多线程面试题 六】、 如何实现线程同步?

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官: 如何实现线程同步&…

Linux touch命令:创建文件及修改文件时间

既然知道了如何在 Linux 系统中创建目录,接下来你可能会想在这些目录中创建一些文件,可以使用 touch 命令。 需要注意的是,touch 命令不光可以用来创建文件(当指定操作文件不存在时,该命令会在当前位置建立一个空文件&…

“第五十三天”

今天没有做什么,不过这个在打印,的时候一直卡着,我一直在想把逗号打印在后面,所以一直想办法确定最后一个是哪一位,这里居然没有绕过来其实可以看做是前面,这样第一个不打印逗号,后面打印就可以…

【笔录】TVP技术沙龙:寻宝AI时代

目录 引言大模型的应用案例大模型三问模型落地可行性考量维度AIGC的几个可行应用方向 引言 大模型是10倍的机会,但并不是平均主义的机会,没有低垂的果实。 企业想在大模型的赛道上跑出成绩,应该怎么做,又要选择哪些赛道&#xff1…

postgresSQL 数据库本地创建表空间读取本地备份tar文件与SQL文件

使用pgAdmin4,你安装PG得文件夹****/16/paAdmin 4 /runtime/pgAdmin4.exe 第一步:找到Tablespaces 第二步:创建表空间名称 第三步:指向数据文件 第四步:找到Databases,创建表空间 第五步:输入数…