先做一个最简程序;然后反汇编一下;

public class hello {public static void main(String[] args) {        int a = 101;}
}

然后来学习几个jvm的基本指令;

第一条是aload_0,似乎每个java控制台程序反汇编了都是这句;

aload_<n>
    从局部变量表加载一个reference类型值到操作数栈中;
    <n>代表当前栈帧中局部变量表的索引值;

然后是invokespecial #1;

invokespecial:用于调用一些需要特殊处理的实例方法、包括实例初始化方法、私有方法和父类方法;

java.lang.object;Object类是所有Java类的祖先;

那么这句是本程序的类实例的初始化;

int a = 101;

反汇编后一共有2句;

bipush        101

istore_1

bipush
    将一个byte类型数据入栈;
    格式:bipush byte
    将立即数byte带符号扩展为一个int类型的值value,然后将value入栈到操作数栈中;

istore_<n>
    将一个int类型数据保存到本地变量表中;
    <n>必须是一个指向当前栈帧局部变量表的索引值;

也就是把101入栈到操作数栈,然后放入本地变量表;因为代码中定义的 a 是一个本地变量;

初步认识是,虚拟机指令是一种类汇编的语言,它有加载和存储指令;

加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传输;

汇编MOV指令是数据传送指令,在寄存器和内存地址之间传送数据;虚拟机的加载和存储指令是在局部变量表和操作数栈之间传送数据;

局部变量表,操作数栈,这些是JVM运行时定义的一些内存区域;

再看一个;

public class hello2 {public static void main(String[] args) {    int a11 = -2147483647;System.out.println(a11);int a16 = -32769;System.out.println(a16);int a07 = 32768;int a08 = 65535;int a09 = 65536;int a10 = 2147483647;System.out.println(a10);}
}

对class反汇编后如下;

用到的相关指令如下;

bipush
    将一个byte类型数据入栈;
    格式:bipush byte
    将立即数byte带符号扩展为一个int类型的值value,然后将value入栈到操作数栈中;

istore_<n>
    将一个int类型数据保存到本地变量表中;
    <n>必须是一个指向当前栈帧局部变量表的索引值;

ldc
    从运行时常量池中提取数据并压入操作数栈;
    格式:ldc index
    index是一个无符号byte类型数据,用作当前类的运行时常量池的索引;

getstatic
    获取类的静态字段值;
    格式:getstatic indexbyte1 indexbyte2
    indexbyte1和indexbyte2用于构建一个指向当前类的运行时常量池的索引值;
    
iload_<n>
    从局部变量表加载一个int类型值到操作数栈中;
    <n>代表一个当前栈帧中局部变量表的索引值;

invokevirtual:用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派),这也是Java语言中最常见的方法分派方式;

一开始是ldc,从反汇编代码看,自己程序给出的数值,像 int a07 = 32768 这样的,32768这些值被放入了运行时常量池;当要用到时把数据压入操作数栈;

然后是istore;把值保存到本地变量表;

然后getstatic,不了解;

运行时常量池,是JVM运行时定义的一个内存区域;

然后是iload;把数值加载到操作数栈;

然后是invokevirtual;这就是调用println方法了;

不是很了解;先看一下吧;

运行时常量池简介
运行时常量池(Runtime Constant Pool),它是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到常量池中。

运行时常量是相对于常量来说的,它具备一个重要特征是:动态性。当然,值相同的动态常量与我们通常说的常量只是来源不同,但是都是储存在池内同一块内存区域。Java语言并不要求常量一定只能在编译期产生,运行期间也可能产生新的常量,这些常量被放在运行时常量池中。这里所说的常量包括:基本类型包装类(包装类不管理浮点型,整形只会管理-128到127)和String(也可以通过String.intern()方法可以强制将String放入常量池)

;Compiled from "hello.java"
public class hello {public hello();Code:0: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":
()V4: returnpublic static void main(java.lang.String[]);Code:0: bipush        1012: istore_13: return
};Compiled from "hello2.java"
public class hello2 {public hello2();Code:0: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":
()V4: returnpublic static void main(java.lang.String[]);Code:0: ldc           #2                  // int -21474836472: istore_13: getstatic     #3                  // Field java/lang/System.out:Ljava/
io/PrintStream;6: iload_17: invokevirtual #4                  // Method java/io/PrintStream.printl
n:(I)V10: ldc           #5                  // int -3276912: istore_213: getstatic     #3                  // Field java/lang/System.out:Ljava/
io/PrintStream;16: iload_217: invokevirtual #4                  // Method java/io/PrintStream.printl
n:(I)V20: ldc           #6                  // int 3276822: istore_323: ldc           #7                  // int 6553525: istore        427: ldc           #8                  // int 6553629: istore        531: ldc           #9                  // int 214748364733: istore        635: getstatic     #3                  // Field java/lang/System.out:Ljava/
io/PrintStream;38: iload         640: invokevirtual #4                  // Method java/io/PrintStream.printl
n:(I)V43: return
}

java虚拟机指令初步学习相关推荐

  1. 【Java 虚拟机原理】线程栈 | 栈帧 | 局部变量表 | 反汇编字节码文件 | Java 虚拟机指令手册 | 程序计数器

    文章目录 一.线程栈 二.栈帧 三.栈帧 - 局部变量表 四.反汇编字节码文件 五.Java 虚拟机指令手册 六.程序计数器 一.线程栈 装载 HelloWorld.class 字节码文件到 Java ...

  2. java樱花_初步学习java专业课程

    初步学习java编程一. 终于触碰到专业课了(有点小兴奋) 计算机语言:人类与计算机交流的语言! 特点:简洁.准确. 计算机语言分为1.二进制语言2.汇编语言3.C/C++{Java之父   Jame ...

  3. Java虚拟机内存区域---学习笔记

    Java虚拟机 虚拟机: 定义:模拟某种计算机体系结构,执行特定指令集的软件. 种类: 系统虚拟机(Virtual Box .VMware) 进程虚拟机(JVM.Adobe Flash Player. ...

  4. 无基础怎么学习java虚拟机,0基础学习Java ——Java 虚拟机结构(上)

    马上注册,结交更多好友,享用更多功能^_^ 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 本帖最后由 回忆一遥远 于 2017-8-16 07:35 编辑 Class 文件格式 Java 编 ...

  5. java虚拟机指令dup的理解

    参考:https://www.cnblogs.com/CLAYJJ/p/7698035.html dup指令的作用:dup指令可以复制操作数栈栈顶的一个字,再将这个字压入栈.也就是对栈顶的内容做了个备 ...

  6. Java虚拟机new和newarray相关指令学习

    先做一个简单程序: import java.io.*;class Employee{String name;int age;String designation;double salary;publi ...

  7. Java 虚拟机学习笔记 | 运行时数据区总结

    前言 要想学习好 Java,Java虚拟(JVM)的学习是绕不开的.学习 Java虚拟(JVM)首先就要先了解的就是Java虚拟(JVM)运行时数据区. 在Java语言和虚拟机规范中对运行时数据区进行 ...

  8. 写给Java程序员的Java虚拟机学习指南

    大家好,我是极客时间<深入拆解Java虚拟机>作者.Oracle Labs高级研究员郑雨迪.有幸借这个专题的机会,能和大家分享为何Java工程师要学Java虚拟机?如何掌握Java虚拟机? ...

  9. 【Java 虚拟机原理】栈帧 | 局部变量表 | 操作数栈 | 方法出口 | JVM 指令逐条解析

    文章目录 前言 一.JVM 指令逐条解析 1.Java 代码 2.Java 虚拟机指令 3.分析 JVM 指令 4.局部变量表 与 操作数栈 二.方法出口 前言 " 栈帧 " 中存 ...

最新文章

  1. c# async await 理解 结合并行处理
  2. 如何进行高效JavaScript单元测试
  3. 牛逼轰轰!GitHub 上 Star 量最高的 5 个机器学习项目
  4. 机器学习第五篇:详解决策树-CART算法
  5. java count 在哪一类里_java 5线程中 Semaphore信号灯,CyclicBarrier类,CountDownLatch计数器以及Exchanger类使用...
  6. 美国高级情报研究计划局(IARPA)发起公共安全问题预测机器学习挑战赛(总奖池10万美金)...
  7. 小鹏汽车港股上市发售价定为每股165港元
  8. 买手机时怎么判断手机性能?
  9. 326 Power of Three 3的幂
  10. CodeFroces gym 100781 A.Adjoin the Networks(贪心)
  11. OceanBase使用 OBD 自动化部署多节点集群
  12. 用HTML/JScript/CSS做一个简单的登录界面
  13. VBE6EXT.OLB不能被加载问题解决方法
  14. HBO宣布续订《西部世界》第三季
  15. 2022考研数学 张宇 基础班【配套张宇30讲】【免费分享】
  16. Android 获取蓝牙设备类型
  17. vue实现页面点击页面滚动-禁止鼠标滑轮滚动页面
  18. 普通人有没有必要学python,什么样的人适合学python
  19. unity 角色鉴赏 spine动画鉴赏人物
  20. 【围观】CISP-PTE 考题示例

热门文章

  1. 0基础怎么学python10010基础怎么学python_0基础的人如何入门 Python ?Python难么?
  2. Vue——基本的代码结构和插值表达式、v-cloak||Vue指令之v-text和v-html||v-bind的三种用法||Vue指令之v-on
  3. ServletConfig 对象
  4. 国产化人大金仓数据库转库工具:oracle12c数据库转kingbase8.6人大金仓数据库实例演示
  5. STM32 FSMC 外部使用SRAM
  6. 解决MPLAB X IDE的文件注释出现乱码的问题
  7. 有效降低传导辐射干扰的小技巧
  8. poj 3579 Median 中间值(二分搜索)
  9. 统计0到n之间1的个数
  10. Given an integer, write a function to determine if it is a power of two