码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【JVM】字节码文件的组成部分



    在这里插入图片描述

    🐌个人主页: 🐌 叶落闲庭
    💨我的专栏:💨
    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;
    
    • 1
    • 2

    具体的java源代码:

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

    要想看到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++;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 字节码:
    • 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命令解压)

  • 相关阅读:
    Python人工智能学习路线(万字长文)
    SpringMVC-针对处理器中的参数提供了许多参数解析器
    C# XML基础入门(XML文件内容增删改查清)
    mcu日志输出的一种方法
    .NET Core WebAPI 部署IIS后 Swagger.json 提示没有找到问题与解决方案
    黑客技术(自学)——网络安全
    C++简单模板介绍——template
    Python集合类型详解(二)——集合处理方法与应用场景
    rdma软件架构的理解。
    Android 13 Wi-Fi状态机流程及Log分析
  • 原文地址:https://blog.csdn.net/qq_64743563/article/details/134095100
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号