Atitit.java 虚拟机的构成 与指令分类 与 指令集合 以及字节码查看工具javjap

Atitit.java 虚拟机的构成 与指令分类 与 指令集合 以及字节码查看工具javjap

1.1. 虚拟机的构成 java虚拟机--处理器、堆栈、寄存器、指令系统。 1

1.2. 虚拟机执行过程1

1.3. 约有250个指令2

2. JVM指令助记符 分类2

2.1. 变量到操作数栈:2

2.2. 算数指令3

2.3. 移位指令3

2.4. 逻辑指令4

2.5. 流程跳转指令4

2.6. Oo指令4

2.7. 运算指令 5

3. 查看指令反编译工具6

3.1.   分析java语言特性的一个好帮手是使用javap工具查看java编译后的字节码,6

3.2. 配置eclipse 的run外部tool7

1.1. 虚拟机的构成 java虚拟机--处理器、堆栈、寄存器、指令系统。

Java堆栈有堆栈块(stack frames (or frames))组成。堆栈块包含Java方法调用的状态。当一个线程调用一个方法时,Java虚拟机会将一个新的块压到Java堆栈中,当这个方法运行结束时,Java虚拟机会将对应的块弹出并抛弃。 
     Java虚拟机不使用寄存器保存计算的中间结果,而是用Java堆栈在存放中间结果。这是的Java虚拟机的指令更紧凑,也更容易在一个没有寄存器的设备上实现Java虚拟机。

1.2. 虚拟机执行过程

Java虚拟机指令由一个字节长度的、代表某种特定含义的操作码(Opcode)以及其后的零个至多个代表此操作参数的操作数构成。虚拟机中许多指令并不包含操作数,只有一个操作码。若忽略异常,JVM解释器使用一下为代码即可有效工作。

复制代码 代码如下:

do{
    自动计算PC寄存器以及从PC寄存器的位置取出操作码
    if(存在操作数) 取出操作数;
    执行操作码所定义的操作;
}while(处理下一次循环)

操作数的数量以及长度,取决于操作码,若一个操作数长度超过了一个字节,将会以Big-Endian顺序存储(高位在前字节码),其值应为(byte1<<8)|byte2。

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:[email protected]

转载请注明来源: http://www.cnblogs.com/attilax/

1.3. 约有250个指令

参考

JVM指令集(指令码、助记符、功能描述) --- 逐渐更新 --- 2011-08-23 - 专栏 - 博客频道 - CSDN.NET.htm

2. JVM指令助记符 分类

2.1. 变量到操作数栈:

iload,iload_,lload,lload_,fload,fload_,dload,dload_,aload,aload_
操作数栈到变量:istore,istore_,lstore,lstore_,fstore,fstore_,dstore,dstor_,astore,astore_
常数到操作数栈:bipush,sipush,ldc,ldc_w,ldc2_w,aconst_null,iconst_ml,iconst_,lconst_,fconst_,dconst_

把数据装载到操作数栈:baload,caload,saload,iaload,laload,faload,daload,aaload
从操作数栈存存储到数组:bastore,castore,sastore,iastore,lastore,fastore,dastore,aastore

2.2. 算数指令

加:iadd,ladd,fadd,dadd
减:is ,ls ,fs ,ds 
乘:imul,lmul,fmul,dmul
除:idiv,ldiv,fdiv,ddiv
余数:irem,lrem,frem,drem
取负:ineg,lneg,fneg,dneg

2.3. 移位指令

移位:ishl,lshr,iushr,lshl,lshr,lushr
按位或:ior,lor
按位与:iand,land
按位异或:ixor,lxor
类型转换:i2l,i2f,i2d,l2f,l2d,f2d(放宽数值转换)
          i2b,i2c,i2s,l2i,f2i,f2l,d2i,d2l,d2f(缩窄数值转换)

2.4. 逻辑指令

2.5. 流程跳转指令

有条件转移:ifeq,iflt,ifle,ifne,ifgt,ifge,ifnull,ifnonnull,if_icmpeq,if_icmpene,
            if_icmplt,if_icmpgt,if_icmple,if_icmpge,if_acmpeq,if_acmpne,lcmp,fcmpl
    fcmpg,dcmpl,dcmpg
复合条件转移:tableswitch,lookupswitch
无条件转移:goto,goto_w,jsr,jsr_w,ret
方法返回:ireturn,lreturn,freturn,dreturn,areturn,return
异常:athrow
finally关键字的实现使用:jsr,jsr_w,ret

2.6. Oo指令

创建类实便:new
创建新数组:newarray,anewarray,multianwarray
访问类的域和类实例域:getfield,putfield,getstatic,putstatic
获取数组长度:arraylength
检相类实例或数组属性:instanceof,checkcast
操作数栈管理:pop,pop2,dup,dup2,dup_xl,dup2_xl,dup_x2,dup2_x2,swap
调度对象的实便方法:invokevirt l
调用由接口实现的方法:invokeinterface
调用需要特殊处理的实例方法:invokespecial
调用命名类中的静态方法:invokestatic
  3)访问字段指令:getfield,putfield,getstatic,putstatic

7)检查实例类型指令:instanceof,checkcast

2.7. 运算指令

算术指令用于对两个操作数栈上的值进行某种特定运算,并把结果重新存入到操作栈顶。
    1)加法指令:iadd,ladd,fadd,dadd
    2)减法指令:isub,lsub,fsub,dsub
    3)乘法指令:imul,lmul,fmul,dmul
    4)除法指令:idiv,ldiv,fdiv,ddiv
    5)求余指令:irem,lrem,frem,drem
    6)取反指令:ineg,leng,fneg,dneg
    7)位移指令:ishl,ishr,iushr,lshl,lshr,lushr
    8)按位或指令:ior,lor
    9)按位与指令:iand,land
    10)按位异或指令:ixor,lxor
    11)局部变量自增指令:iinc
    12)比较指令:dcmpg,dcmpl,fcmpg,fcmpl,lcmp

Java虚拟机没有明确规定整型数据溢出的情况,但规定了

3. 查看指令反编译工具

3.1.   分析java语言特性的一个好帮手是使用javap工具查看java编译后的字节码,

楼主今天在学习java泛型中的桥方法时遇到一些不解,想到javap这个好工具可以帮助解答一些疑惑,索性就捣鼓如何在eclipse中配置javap工具快速查看java字节码。

选项:

-help 帮助

-l 输出行和变量的表

-public 只输出public方法和域

-protected 只输出public和protected类和成员

-package 只输出包,public和protected类和成员,这是默认的

-p -private 输出所有类和成员

-s 输出内部类型签名

-c 输出分解后的代码,例如,类中每一个方法内,包含java字节码的指令,

-verbose 输出栈大小,方法参数的个数

-constants 输出静态final常量

3.2. 配置eclipse 的run外部tool

Worikdir::: ${project_loc}

Argue:::-classpath WEB-INF\classes -c  ${java_type_name}

-classpath WEB-INF\classes -l -p -s  -constants -v -c  ${java_type_name}

package aaa;

public class haloDecomp {

public static void main(String[] args) {

System.out.println("helo world");

}

}

返回zai console::

Compiled from "haloDecomp.java"

public class aaa.haloDecomp {

public aaa.haloDecomp();

Code:

0: aload_0

1: invokespecial #8                  // Method java/lang/Object."<init>":()V

4: return

public static void main(java.lang.String[]);

Code:

0: getstatic     #16                 // Field java/lang/System.out:Ljava/io/PrintStream;

3: ldc           #22                 // String helo world

5: invokevirtual #24                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

8: return

}

Classfile /C:/workspace 空格/AtiPlatf/WEB-INF/classes/aaa/haloDecomp.class

Last modified 2016-2-8; size 755 bytes

MD5 checksum 6cd22bffd3cc27d213122a02856eb541

Compiled from "haloDecomp.java"

public class aaa.haloDecomp

SourceFile: "haloDecomp.java"

minor version: 0

major version: 50

flags: ACC_PUBLIC, ACC_SUPER

Constant pool:

#1 = Class              #2             //  aaa/haloDecomp

#2 = Utf8               aaa/haloDecomp

#3 = Class              #4             //  java/lang/Object

#4 = Utf8               java/lang/Object

#5 = Utf8               <init>

#6 = Utf8               ()V

#7 = Utf8               Code

#8 = Methodref          #3.#9          //  java/lang/Object."<init>":()V

#9 = NameAndType        #5:#6          //  "<init>":()V

#10 = Utf8               LineNumberTable

#11 = Utf8               LocalVariableTable

#12 = Utf8               this

#13 = Utf8               Laaa/haloDecomp;

#14 = Utf8               main

#15 = Utf8               ([Ljava/lang/String;)V

#16 = Fieldref           #17.#19        //  java/lang/System.out:Ljava/io/PrintStream;

#17 = Class              #18            //  java/lang/System

#18 = Utf8               java/lang/System

#19 = NameAndType        #20:#21        //  out:Ljava/io/PrintStream;

#20 = Utf8               out

#21 = Utf8               Ljava/io/PrintStream;

#22 = String             #23            //  helo world

#23 = Utf8               helo world

#24 = Methodref          #25.#27        //  java/io/PrintStream.println:(Ljava/lang/String;)V

#25 = Class              #26            //  java/io/PrintStream

#26 = Utf8               java/io/PrintStream

#27 = NameAndType        #28:#29        //  println:(Ljava/lang/String;)V

#28 = Utf8               println

#29 = Utf8               (Ljava/lang/String;)V

#30 = Methodref          #1.#31         //  aaa/haloDecomp.t2:()V

#31 = NameAndType        #32:#6         //  t2:()V

#32 = Utf8               t2

#33 = Utf8               args

#34 = Utf8               [Ljava/lang/String;

#35 = Class              #36            //  com/attilax/lang/AString

#36 = Utf8               com/attilax/lang/AString

#37 = Methodref          #35.#38        //  com/attilax/lang/AString."<init>":(Ljava/lang/String;)V

#38 = NameAndType        #5:#29         //  "<init>":(Ljava/lang/String;)V

#39 = Methodref          #35.#40        //  com/attilax/lang/AString.Left:(I)Lcom/attilax/lang/AString;

#40 = NameAndType        #41:#42        //  Left:(I)Lcom/attilax/lang/AString;

#41 = Utf8               Left

#42 = Utf8               (I)Lcom/attilax/lang/AString;

#43 = Methodref          #25.#44        //  java/io/PrintStream.println:(Ljava/lang/Object;)V

#44 = NameAndType        #28:#45        //  println:(Ljava/lang/Object;)V

#45 = Utf8               (Ljava/lang/Object;)V

#46 = Utf8               SourceFile

#47 = Utf8               haloDecomp.java

{

public aaa.haloDecomp();

Signature: ()V

flags: ACC_PUBLIC

LineNumberTable:

line 5: 0

LocalVariableTable:

Start  Length  Slot  Name   Signature

0       5     0  this   Laaa/haloDecomp;

Code:

stack=1, locals=1, args_size=1

0: aload_0

1: invokespecial #8                  // Method java/lang/Object."<init>":()V

4: return

LineNumberTable:

line 5: 0

LocalVariableTable:

Start  Length  Slot  Name   Signature

0       5     0  this   Laaa/haloDecomp;

public static void main(java.lang.String[]);

Signature: ([Ljava/lang/String;)V

flags: ACC_PUBLIC, ACC_STATIC

LineNumberTable:

line 8: 0

line 9: 8

line 10: 11

LocalVariableTable:

Start  Length  Slot  Name   Signature

0      12     0  args   [Ljava/lang/String;

Code:

stack=2, locals=1, args_size=1

0: getstatic     #16                 // Field java/lang/System.out:Ljava/io/PrintStream;

3: ldc           #22                 // String helo world

5: invokevirtual #24                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

8: invokestatic  #30                 // Method t2:()V

11: return

LineNumberTable:

line 8: 0

line 9: 8

line 10: 11

LocalVariableTable:

Start  Length  Slot  Name   Signature

0      12     0  args   [Ljava/lang/String;

public static void t2();

Signature: ()V

flags: ACC_PUBLIC, ACC_STATIC

LineNumberTable:

line 14: 0

line 15: 19

LocalVariableTable:

Start  Length  Slot  Name   Signature

Code:

stack=4, locals=0, args_size=0

0: getstatic     #16                 // Field java/lang/System.out:Ljava/io/PrintStream;

3: new           #35                 // class com/attilax/lang/AString

6: dup

7: ldc           #22                 // String helo world

9: invokespecial #37                 // Method com/attilax/lang/AString."<init>":(Ljava/lang/String;)V

12: iconst_2

13: invokevirtual #39                 // Method com/attilax/lang/AString.Left:(I)Lcom/attilax/lang/AString;

16: invokevirtual #43                 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V

19: return

LineNumberTable:

line 14: 0

line 15: 19

LocalVariableTable:

Start  Length  Slot  Name   Signature

}

参考

【JAVA】虚拟机指令集 - 老马睡不醒的日志 - 网易博客.htm

Java虚拟机工作原理 - - ITeye技术网站.htm

Java字节码指令集的使用详细_java_脚本之家.htm

javap(反汇编命令)详解 - Robin Hu的专栏 - 博客频道 - CSDN.NET.htm

JVM指令集(指令码、助记符、功能描述) --- 逐渐更新 --- 2011-08-23 - 专栏 - 博客频道 - CSDN.NET.htm

JVM指令集(指令码、助记符、功能描述) --- 逐渐更新 --- 2011-08-23 - 专栏 - 博客频道 - CSDN.NET.htm

时间: 02-06

Atitit.java 虚拟机的构成 与指令分类 与 指令集合 以及字节码查看工具javjap的相关文章

Atitit..net&#160;clr&#160;il指令集&#160;以及指令分类&#160;&#160;与指令详细说明

Atitit..net clr il指令集 以及指令分类  与指令详细说明 1.1. .NET CLR 和 Java VM 都是堆叠式虚拟机器(Stack-Based VM), 1 1.2. 查看工具ILDASM1 1.3. 此程式执行时,关键的记忆体有三种,分別是:1 1.4. Il指令集2 1.4.1. Mov指令3 1.4.2.  跳转指令集合6 1.4.3.  算术 逻辑 与移位指令8 1.4.4. 类型转换9 1.4.5. Other  and oo指令10 2. 参考12 1.1. 

Java 编程的动态性,第 7 部分: 用 BCEL 设计字节码--转载

在本系列的最后三篇文章中,我展示了如何用 Javassist 框架操作类.这次我将用一种很不同的方法操纵字节码——使用 Apache Byte Code Engineering Library (BCEL).与 Javassist 所支持的源代码接口不同,BCEL 在实际的 JVM 指令层次上进行操作.在希望对程序执行的每一步进行控制时,底层方法使 BCEL 很有用,但是当两者都可以胜任时,它也使 BCEL 的使用比 Javassist 要复杂得多. 我将首先讨论 BCEL 基本体系结构,然后本

深入理解Java虚拟机笔记---类索引,父类索引,接口索引集合

类索引(this_class)和父类索引(super_class)都是u2类型的数据,而接口索引(interfaces)是一组u2类型的数据集合,class文件中由这三项数据来确定这个类的继承关系.类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名.由于Java语言不允许多继承,所以父类索引只有一个,除了java.lang.Object之外,所有的Java类都有父类,因了除了java.lang.Object之外,所有Java类的父类索引都不为0.接口索引集合用来描述这个实现实

理解Java虚拟机体系结构

1 概述 众所周知,Java支持平台无关性.安全性和网络移动性.而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操作系统是什么.正是得益于Java虚拟机,它号称的"一次编译,到处运行"才能有所保障. 1.1 Java程序执行流程 Java程序的执行依赖于编译环境和运行环境.源码代码转变成可执行的机器代码,由下面的流程完成: Java技术的核心就是Java虚拟机,因为所有的Java程序都在虚拟机上运行.Java程序的运行需要Java

深入理解Java虚拟机- 学习笔记 - Java内存模型与线程

除了在硬件上增加告诉缓存之外,为了使得处理器内部的运算单元能尽量被充分利用,处理器可能会对输入代码进行乱序执行(Out-Of-Order Execution)优化,处理器会在计算之后将乱序执行的结果重组,保证该结果与顺序执行的结果一致,但并不保证程序中各个语句计算的先后顺序与输入代码中的顺序一致,因此,如果存在一个计算任务依赖另外一个计算任务的中间结果,那么其顺序性并不能靠代码的先后顺序来保证.与处理器的乱序优化执行类似,Java虚拟机的即时编译器中也有类似的指令重排序(Instruction

深入理解java虚拟机-第七章

第7章 虚拟机类加载机制 类的加载的时机 加载 Loading, 连接 Linking(验证 Verfiication, 准备Preparation, 解析 Resolution) 初始化 Initialization, 使用Using和卸载 Unloading 类加载的过程: 1,加载: 加载是“类加载" class loading过程珠一个阶段,在加载阶段,虚拟机需要完成以下3个事情. 1 通过一个类的全限定名来获取定义此类的二进制字节流 2 将这个字节流所代表的静态存储结构转化为方法区的运

Java虚拟机 运行时数据区

Java在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途.创建和销毁的时间,有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,有些则是与线程一一对应,随线程的开始和结束而创建和销毁. Java虚拟机所管理的内存将会包括以下几个运行时数据区域 程序计数器(Program Counter Register) 它是一块较小的内存空间,它的作用可以看做是当先线程所执行的字节码的信号指示器. 每一条JVM线程都有自己的PC寄存器,各条线程之间互不影响,独立存

Java虚拟机12:Java内存模型

什么是Java内存模型 Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果.在此之前,主流程序语言(如C/C++等)直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台上内存模型的差异,有可能导致程序在一套平台上并发完全正常,而在另外一套平台上并发访问却经常出错,因此在某些场景下就不许针对不同的平台来编写程序. Java内存模型即要定义得足够严谨,才能

Java虚拟机内存分配详解

简介 了解Java虚拟机内存分布的好处 1.了解Java内存管理的细节,有助于程序员编写出性能更好的程序.比如,在新的线程创建时,JVM会为每个线程创建一个专属的栈 (stack),其栈是先进后出的数据结构,这种方式的特点,让程序员编程时,必须特别注意递归方法要尽量少使用,另外栈的大小也有一定的限制,如果过多 的递归,容易导致stack overflow. 2.了解Java内存管理的细节,一旦内存管理出现问题,有助于找到问题的根本原因所在. 3.了解Java内存管理的内幕,有助于优化JVM,从而