先做一个简单程序;

import java.io.*;class Employee{String name;int age;String designation;double salary;public Employee(String name){this.name = name;}public void empAge(int empAge){age =  empAge;}public void empDesignation(String empDesig){designation = empDesig;}public void empSalary(double empSalary){salary = empSalary;}public void printEmployee(){System.out.println("名字:"+ name );System.out.println("年龄:" + age );System.out.println("职位:" + designation );System.out.println("薪水:" + salary);}
}public class EmployeeTest{public static void main(String[] args){Employee empOne = new Employee("RUNOOB1");Employee empTwo = new Employee("RUNOOB2");empOne.empAge(26);empOne.empDesignation("高级工程师");empOne.empSalary(1000);empOne.printEmployee();empTwo.empAge(21);empTwo.empDesignation("中级工程师");empTwo.empSalary(500);empTwo.printEmployee();}
}

构建;同一个文件中有多个java类,只能有一个是public,其他类要把public去掉;

然后反汇编;如下;

看一下反汇编后的指令;

main里面,第0和第10行,是new指令;

new指令的用途是创建类实例;

然后还包含多条invokevirtual指令;invokevirtual 指令用于调用对象的实例方法;

java虚拟机中有一类指令是 方法调用和返回指令;其说明如下;

invokevirtual 指令用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派),这也是Java语言中最常见的方法分派方式。
invokeinterface 指令用于调用接口方法,它会在运行时搜索一个实现了这个接口方法的对象,找出适合的方法进行调用。
invokespecial 指令用于调用一些需要特殊处理的实例方法,包括实例初始化(<init>)方法、私有方法和父类方法。
invokestatic  调用静态方法(static方法)。
invokedynamic 指令用于在运行时动态解析出调用点限定符所引用的方法,并执行该方法,前面4条调用指令的分派逻辑都固化在Java虚拟机内部,而invokedynamic指令的分派逻辑是由用户所设定的引导方法决定的。

再做一个程序;

public class TestArray {public static void main(String[] args) {int size = 10;double[] myList = new double[size];myList[0] = 5.6;myList[1] = 4.5;myList[2] = 3.3;myList[3] = 13.2;myList[4] = 4.0;myList[5] = 34.33;myList[6] = 34.0;myList[7] = 45.45;myList[8] = 99.993;myList[9] = 11123;double total = 0;for (int i = 0; i < size; i++) {total += myList[i];}System.out.println("总和为: " + total);}
}

构建,并反汇编;如下;

看一下指令里面包含 newarray;

newarray是创建数组的指令;

然后还有 dastore 指令;dastore是 将一个操作数栈的值存储到数组元素中的指令;

86行,daload,这是把一个数组元素加载到操作数栈;

相关这一类的Java虚拟机指令,其说明如下;

创建数组的指令:newarray、anewarray、multianewarray。
访问类字段(static字段,或者称为类变量)和实例字段(非static字段,或者称为实例变量)的指令:getfield、putfield、getstatic、putstatic。
把一个数组元素加载到操作数栈的指令:baload、caload、saload、iaload、laload、faload、daload、aaload。
将一个操作数栈的值存储到数组元素中的指令:bastore、castore、sastore、iastore、fastore、dastore、aastore。
取数组长度的指令:arraylength。
检查类实例类型的指令:instanceof、checkcast。

虚拟机指令应该算是类汇编的指令;但是和x86汇编有很大的不同;其包含的new和newarray这一类型指令在x86汇编中没有对应类别;

Java虚拟机new和newarray相关指令学习相关推荐

  1. 深入理解Java虚拟机(第3版)学习笔记——JAVA内存区域(超详细)

    深入理解Java虚拟机(第3版)学习笔记--JAVA内存区域(超详细) 运行时数据区域 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 直接内存 对象的创建 对象的内存布局 ...

  2. Java虚拟机启动整体流程和基础学习(内容很多,不可快餐阅读),推理+源码论证

    不啰嗦,直接看: ISA指令强关联CPU平台,那么汇编语言也一定强关联CPU平台,而C语言又是对汇编最简单的抽象,也就一定会耦合不同CPU平台的代码,这也就是意味着,在写C/C++项目的时候,必须要考 ...

  3. 【深入理解java虚拟机】 - JVM字节码指令介绍

    文章目录 什么是字节码指令 javap的用法 字节码与数据类型 字节码指令集 加载和存储指令 运算指令 类型转换指令 对象创建与访问指令 操作数栈管理指令 控制转移指令 方法调用和返回指令 异常处理指 ...

  4. 《深入理解Java虚拟机》(第二版)学习1:JVM的内存划分

    运行时数据区 先来一张图描述一下 JVM 的内存划分 PS:自己画的,丑是难免丑了点- 程序计数器(Program Counter Register) 程序计数器(Program Counter Re ...

  5. 《深入理解Java虚拟机》(第二版)学习3:垃圾收集器

    垃圾收集器 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现. 我们这里讨论的收集器主要是基于JDK 1.7 Update 14之后的 Hotspot VM . Serial 收 ...

  6. Java虚拟机专题之字节码指令(读书笔记)

    一 字节码与数据类型 大部分的指令都包含了其操作所对应的数据类型信息. 比如iload指令用于从局部变量表中加载int类型的数据到操作栈中,而fload指令加载的则是float数据类型的数据. 二 加 ...

  7. 《深入理解Java虚拟机》(第二版)学习2:垃圾收集算法

    对象存活判断 在对堆进行回收之前虚拟机需要判断这些对象中那些是"存活"的. 引用计数算法(Reference Counting) 原理:给对象中添加一个引用计数器,每当有一个地方引 ...

  8. 了解java虚拟机mdash;非堆相关参数设置(4)

    非堆内存相关配置 -XX:PermSize 永久区初始大小 -XX:MaxPermSize 永久区最大大小 在JDK1.8中使用-XX:MxMetaspaceSize配置永久区最大大小 -Xss 线程 ...

  9. 深入理解Java虚拟机——加载和存储指令

    目录 一.加载和存储指令的概述 二.加载和存储指令的内容 三.加载和存储指令的示例 一.加载和存储指令的概述 加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传输. 二.加载和存储指令的 ...

最新文章

  1. mysql忘记root密码解决方法(版本mysql-8.0.12)
  2. Referenced file contains errors (http://www.springframework.org/schema...错误--转载
  3. BAPI_ACC_DOCUMENT_POST生成预制凭证增强
  4. 指定端口传输_高速数字传输链路测试 - 高速数字电路仿真设计与测试技术发展趋势综述(二)...
  5. python和stata_在Python中实现Stata的stack功能
  6. 阴阳师服务器维护稍后,《阴阳师》手游3月20日维护更新公告
  7. java vector 输出_5.7(java学习笔记)Vector、Enumeration
  8. 白银TD盈亏计算实例介绍
  9. 网络授时服务 NTP
  10. matlab重要性采样,Importance Sampling (重要性采样)介绍 | 文艺数学君
  11. Linux SSHD服务安装与维护详解(二)——SSHD调优和fail2ban联动
  12. 【一起学Rust · 项目实战】命令行IO项目minigrep——测试驱动开发完善功能
  13. matlab用Java绘图_Java中使用MATLAB作图
  14. vue后台管理框架(iview + vue)
  15. (转)一个偷食禁果的女孩--一件我亲眼目睹的真实感人故事
  16. python原生是什么意思_什么是 云原生?
  17. 如何批量将 Excel 文档转为 Svg 格式
  18. 计算机c盘加容量,增加C盘空间,详细教您怎么增加C盘空间
  19. 北理计算机学院高扬,李爽_北京理工大学计算机学院
  20. vim 写文档 (自身功能tags, txt2tags生成网页pdf等)

热门文章

  1. Markdown转LaTeX的Python程序大全(持续更新)
  2. 【转载】【FS】FATFS文件系统介绍(未完待续........2018.4.1)
  3. linux C库编译
  4. 设备驱动程序INF文件
  5. java 向上取整_java 中的异常处理和常用类使用
  6. ahp层次分析法matlab代码_Matlab数据分析实战,基于AHP高校食堂满意度调查分析
  7. 新版本Chrome同源策略、跨域问题处理No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.
  8. Oracle 数据库-服务器端字符集查看方法
  9. Python+selenium 自动化-mac下安装配置chrome驱动方法
  10. Python 基础篇-正斜杠(/)和反斜杠(\)的用法