《深入Java虚拟机》笔记:指令集 (转)
《深入Java虚拟机》笔记:指令集
| 指令 | 含义 |
| iconst_m1 | 把int型常量-1压入栈中 |
| iconst_0 | 把int型常量压入栈中 |
| fconst_1 | 把float型常量1压入栈中 |
| lconst_2 | 把long型常量2压入栈中 |
| dconst_3 | 把double型常量3压入栈中 |
| bipush byte1 | 把byte1转换成int型压入栈中 |
| sipush byte1,byte2 | 把byte1,byte2组成的short转换成int压入栈中 |
| aconst_null | 把空对象压入栈中 |
| ldc indexbyte1 | 把常量池中指定下标的一个字长压入栈 |
| ldc_w indexbyte1,indexbyte2 | 把常量池中指定下标的一个字长压入栈 |
| ldc2_w indexbyte1,intexbyte2 | 把常量池中指定下标的两个字长压入栈 |
| pop | 弹出栈顶的一个字 |
| pop2 | 弹出栈顶的两个字 |
| swap | 交换栈顶的两个字 |
| dup | 复制栈顶的一个字 |
| dup2 | 复制栈顶的两个字 |
| dup_x1 | 复制一字,并将弹出的两字压栈 |
| dup_x2 | 复制一字,并将弹出的三字压栈 |
| dup2_x1 | 复制两字,并将弹出的三字压栈 |
| dup2_x2 | 复制两字,并将弹出的四字压栈 |
| iload vindex | 将位置vindex的int型局部变量压入栈 |
| iload_0 | 将位置0的int型局部变量压入栈 |
| fload vindex | 将位置vindex的float型局部变量压入栈 |
| fload_0 | 将位置0的float型局部变量压入栈 |
| lload vindex | 将位置vindex的long型局部变量压入栈 |
| lload_0 | 将位置0的long型局部变量压入栈 |
| dload vindex | 将位置vindex的double型局部变量压入栈 |
| dload_0 | 将位置0的double型局部变量压入栈 |
| aload vindex | 将位置vindex的对象引用局部变量压入栈 |
| aload_0 | 将位置0的对象引用局部变量压入栈 |
| istore vindex | 弹出int型,存储在vindex处的局部变量 |
| istore_0 | 弹出int型,存储在0处的局部变量 |
| fstore vindex | 弹出float型,存储在vindex处的局部变量 |
| fstore_0 | 弹出float型,存储在0处的局部变量 |
| lstore vindex | 弹出long型,存储在vindex处的局部变量 |
| lstore_0 | 弹出long型,存储在0处的局部变量 |
| dstore vindex | 弹出double型,存储在vindex处的局部变量 |
| dstore_0 | 弹出double型,存储在0处的局部变量 |
| astore vindex | 弹出对象引用类型,存储在vindex处的局部变量 |
| astore_0 | 弹出对象引用类型,存储在0处的局部变量 |
| wide iload byte1,byte2 | wide能把原来的一字节的参数变成处理两字节 |
| i2l | 把int类型转换成long类型,其他类似,不再举例 |
| iadd | 弹出两个int型,相加后结果压入栈 |
| ladd | 弹出两个long型,相加后结果压入栈 |
| iinc vindex,const | 把常量const与位于vindex的局部变量相加 |
| wide iinc index1,intdex2,const1,const2 | 把常量与位于vindex1,vindex2的局部变量相加 |
| isub | 弹出两个int型,相减后lint型结果压入栈 |
| lsub | 弹出两个long型,相减后long型结果压入栈 |
| imul | 弹出两个int型,相乘后int型结果压入栈 |
| lmul | 弹出两个long型,相乘后long型结果压入栈 |
| idev | 弹出两个int型,相除后int型结果压入栈 |
| ldev | 弹出两个long型,相除后long型结果压入栈 |
| irem | 弹出两个int型,取余后int型结果压入栈 |
| lrem | 弹出两个long型,取余后long型结果压入栈 |
| ineg | 弹出一个int型,取反后int型结果压入栈 |
| lneg | 弹出一个long型,取反后long型结果压入栈 |
| ishl | 向左对int型值进行移位操作(long类似) |
| ishr | 向右对int型值进行算术移位操作 |
| iushr | 向右对int型值进行逻辑移位操作 |
| iand | 对两个int类型值进行逻辑与运算(long类似) |
| ior | 对两个int类型值进行逻辑或运算 |
| ixor | 对两个int类型值进行逻辑异或运算 |
| fadd | 弹出两个float型,相加后float型结果压入栈 |
| fsub | 弹出两个float型,相减后float型结果压入栈 |
| fmul | 弹出两个float型,相乘后float型结果压入栈 |
| fdiv | 弹出两个float型,相除后float型结果压入栈 |
| frem | 弹出两个float型,取余后float型结果压入栈 |
| new indexbyte1,indexbyte2 | 在堆中创建一个新的对象,将其压入栈中 |
| putfield indexbyte1,intdebyte2 | 设置对象字段的值,值和对象引用都从栈获取 |
| getfield indexbyte1,indexbyte2 | 将对象字段压入栈,对象引用从栈中获取 |
| putstatic indexbyte1,indexbyte2 | 设置类静态变量的值,从栈中获取 |
| getstatic indexbyte1,indexbyte2 | 将静态变量压入栈 |
| checkcast indexbyte1,indexbyte2 | 如果栈中的引用不是指定位置的类,则抛出异常 |
| instanceof indexbyte1,indexbyte2 | 同上,不过是往结果中压入true或false |
| newarray atype | 从栈中弹出长度,分配atype类型的数组 |
| anewarray indexbyte1,intdexbyte2 | 从栈中取长度,index取类型 |
| multianewarray index1,index2,dimensions | 分配多维数组 |
| arraylength | 从栈中弹出一个引用,并将其长度压入栈 |
| baload | 从栈中取数组引用和下标,把对应boolean压入栈 |
| caload | 同上,char |
| saload | 同上,short |
| iaload | 同上,int |
| laload | 同上,long |
| faload | 同上,folat |
| daload | 同上,double |
| aaload | 同上,array |
| bastore |
将byte或boolean类型的值value、索引index、数组引用arrayref弹出栈,赋值为arrayref[index]=value 其他类型同上 |
| ifeq branchbyte1,branchbyte2 | 从栈中弹出int型,为0则跳转到指定的分支执行 |
| ifne branchbyte1,branchbyte2 | 同上,不为0则跳转到指定的分支执行 |
| iflt branchbyte1,branchbyte2 | 同上,如果小于0,则跳转到指定的分支执行 |
| ifle branchbyte1,branchbyte2 | 同上,如果小于等于0,则跳转到指定的分支执行 |
| ifgt branchbyte1,branchbyte2 | 同上,如果大于0,则跳转到指定的分支执行 |
| ifge branchbyte1,branchbyte2 | 同上,如果大于等于0,则跳转到指定的分支执行 |
| if_icmpeq branchbyte1,branchbyte2 | 栈中弹出两个int,如果的一个等于第二个,跳转 |
| if_icmpme branchbyte1,branchbyte2 | 栈中弹出两个int,如果的一个不等于第二个,跳转 |
| if_icmplt branchbyte1,branchbyte2 | 栈中弹出两个int,如果的一个小于第二个,跳转 |
| if_icmple branchbyte1,branchbyte2 | 栈中弹出两个int,如果的一个小于等于第二个,跳转 |
| if_icmpgt branchbyte1,branchbyte2 | 栈中弹出两个int,如果的一个大于第二个,跳转 |
| if_icmpge branchbyte1,branchbyte2 | 栈中弹出两个int,如果的一个大于等于第二个,跳转 |
| lcmp | 从栈中弹出两个long,把结果-1、0、1放入栈 |
| fcmpg | 从栈中弹出两个float,把结果-1、0、1放入栈 |
| fcmpl | 从栈中弹出两个float,把结果-1、0、1放入栈 |
| dcmpg | 从栈中弹出两个double,把结果-1、0、1放入栈 |
| dcmpl | 从栈中弹出两个double,把结果-1、0、1放入栈 |
| ifnull branchbyte1,branchbyte2 | 从栈中弹出,如果是null就跳到分支 |
| ifnonnull branchbyte1,branchbyte2 | 从栈中弹出,如果不是null就跳到分支 |
《深入Java虚拟机》笔记:指令集 (转)的更多相关文章
- java虚拟机笔记-1
java虚拟机学习笔记 Java技术的核心就是Java虚拟机,因为所有的Java程序都在虚拟机上运行.Java程序的运行需要Java虚拟机.Java API和Java Class文件的配合.Java虚 ...
- Java虚拟机笔记(五):JVM中对象的分代
为什么要分代 为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用, ...
- Java虚拟机笔记(四):垃圾收集器
前言 前一篇文章介绍了内存的垃圾收集算法,现在介绍下内存回收的具体实现--垃圾收集器. 由于Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商,不同版本的虚拟机所提供的垃圾收集 ...
- Java虚拟机笔记(三):垃圾收集算法
一.标记-清除(Mark-Sweep)算法 标记清除算法是最基础的收集算法,其他收集算法都是基于这种思想. 标记清除算法分为“标记”和“清除”两个阶段:首先标记出需要回收的对象,标记完成之后统一清除对 ...
- Java虚拟机笔记(二):GC垃圾回收和对象的引用
为什么要了解GC 我们都知道Java开发者在开发过程中是不需要关心对象的回收的,因为Java虚拟机的原因,它会自动回收那些失效的垃圾对象.那我们为什么还要去了解GC和内存分配呢? 答案很简单:当我们需 ...
- Java虚拟机笔记(一):类加载机制
一.概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 二.类加载的生命周期 类从被加载到 ...
- 深入理解java虚拟机笔记Chapter12
(本节笔记的线程收录在线程/并发相关的笔记中,未在此处提及) Java内存模型 Java 内存模型主要由以下三部分构成:1 个主内存.n 个线程.n 个工作内存(与线程一一对应) 主内存与工作内存 J ...
- Java虚拟机笔记 – JVM 自定义的类加载器的实现和使用2
1.用户自定义的类加载器: 要创建用户自己的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定类的名 ...
- 深入理解Java虚拟机笔记
1. Java虚拟机所管理的内存 2. 对象创建过程 3. GC收集 4. HotSpot算法的实现 5. 垃圾收集器 6. 对象分配内存与回收细节 7. 类文件结构 8. 虚拟机类加载机制 9.类加 ...
- 深入理解java虚拟机笔记之一
Java的技术体系主要有支撑java程序运行的虚拟机,提供各开发领域接口支持Java API,java编程语言及许多第三方java框架( 如Spring,Structs等)构成. 可以把Java程序设 ...
随机推荐
- Lambda高手之路第三部分
转http://www.cnblogs.com/lazycoding/archive/2013/01/06/2847587.html 背后的秘密-MSIL 通过著名的LINQPad,我们可以更深入的查 ...
- Java NIO 完全学习笔记(转)
本篇博客依照 Java NIO Tutorial翻译,算是学习 Java NIO 的一个读书笔记.建议大家可以去阅读原文,相信你肯定会受益良多. 1. Java NIO Tutorial Java N ...
- How-To: add EPEL repository to Centos 6.x is Easy!
How-To: add EPEL repository to Centos 6.x is Easy! | ITek Blog How-To: add EPEL repository to Centos ...
- JavaScript之面向对象1
学习过Java程序的开发人员都知道面向对象是怎么回事. 面向对象无非就是封装.多态.继承 比如: 声明一个类: class Person{ //私有成员 private String name; pr ...
- 安卓MP3播放器开发实例(1)之音乐列表界面
学习安卓开发有一年了,想想这一年的努力,确实也收获了不少.也找到了比較如意的工作. 今天准备分享一个以前在初学阶段练习的一个项目.通过这个项目我真正的找到了开发安卓软件的感觉,从此逐渐步入安卓开发的正 ...
- eclipse中我要同时看两个console
eclipse中我要同时看两个console 有一个按钮“New Console View”,可以让你再建一个Console,还有一个按钮“Display Selected Console”,可以在两 ...
- VS快捷键教程
删除或剪切一行(Ctrl + X) 不须要选择不论什么文本, 用来剪切一行, 最经常使用来删除一行. 删除一行也能用 Shift+Delete 格式化整个文档(Ctrl + K, Ctrl + D) ...
- CSDN博文大赛赛况简报
CSDN博文大赛已经開始两周啦.如今赛况怎样呢,接下来,小编为大家揭晓. 大赛自2014年6月10日正式开赛以来.博友们踊跃发表文章,提交文章.到眼下为止,博主们提交博文1045余篇.且以上这些数据还 ...
- 开玩笑Web它servlet(五岁以下儿童)---- 如何解决servlet线程安全问题
servlet默认值是安全线的存在,但说白,servlet安全线实际上是一个多线程线程安全问题.因为servlet它正好是一个多线程的安全问题出现. 每次通过浏览器http同意提交请求,将一个实例se ...
- java socket 的参数选项解读(转)
java socket中有很多参数可以选择,这篇博客的目的是沉淀出这些参数的语义和用法,供自己以后查阅. 1.java socket参数选项总览 在JDK1.6中有如下参数选项: 1 public f ...