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:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/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

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

  1. Atitit..net clr il指令集 以及指令分类  与指令详细说明

    Atitit..net clr il指令集 以及指令分类  与指令详细说明 1.1. .NET CLR 和 Java VM 都是堆叠式虚拟机器(Stack-Based VM), 1 1.2. 查看工具 ...

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

    在本系列的最后三篇文章中,我展示了如何用 Javassist 框架操作类.这次我将用一种很不同的方法操纵字节码——使用 Apache Byte Code Engineering Library (BC ...

  3. 推荐Java字节码解析工具classpy

    Classpy Classpy is a GUI tool for investigating Java class file, Lua binary chunk, Wasm binary code, ...

  4. java字节码的工具(含IDEA插件)

    转:https://blog.csdn.net/qq_34039315/article/details/78561493 javap方式 最基础的方式,此处不做介绍 windows下的工具jclass ...

  5. 深入理解java虚拟机笔记Chapter8

    运行时栈帧结构 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法 ...

  6. 深入Java虚拟机

    第一章:Java体系结构介绍 1.Java为什么重要?       Java是为网络而设计的,而Java这种适合网络环境的能力又是由其体系结构决定的,可以保证安全健壮和平台无关的程序通过网络传播. 2 ...

  7. 理解Java虚拟机体系结构

    1 概述 众所周知,Java支持平台无关性.安全性和网络移动性.而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操作系统是什么.正是得益于Jav ...

  8. 《深入Java虚拟机学习笔记》- 第1章 Java体系结构

    一.体系结构组成 当编写并运行一个Java程序时,就同时体验了这四种技术.用Java语言编写源代码,编译成Java Class文件,然后再在Java虚拟机上运行class文件.当编写程序时,通过调用类 ...

  9. 深入Java虚拟机读书笔记第一章Java体系结构介绍

    第1章 Java体系结构介绍 Java技术核心:Java虚拟机 Java:安全(先天防bug的设计.内存).健壮.平台无关.网络无关(底层结构上,对象序列化和RMI为分布式系统中各个部分共享对象提供了 ...

随机推荐

  1. java中的JDBC

    Java 是通过 JDBC 技术实现对各种数据库访问的,换句话说,JDBC 充当了 Java 应用程 序与各种不同数据库之间进行对话的媒介. JDBC 是 Java 数据库连接(Java DataBa ...

  2. 「Baltic2015」Network

    题目描述 原文 The government of Byteland has decided that it is time to connect their little country to th ...

  3. POJ 3068 "Shortest" pair of paths(费用流)

    [题目链接] http://poj.org/problem?id=3068 [题目大意] 给出一张图,要把两个物品从起点运到终点,他们不能运同一条路过 每条路都有一定的费用,求最小费用 [题解] 题目 ...

  4. 【分块】bzoj2453 维护队列

    http://www.cnblogs.com/autsky-jadek/p/4020296.html 同bzoj2120. #include<cstdio> #include<cma ...

  5. Python中xPath技术和BeautifulSoup的使用

    xpath基本知识 XPath语法:使用路径表达式来选取XML或HTML文档中的节点或节点集 路径表达式 nodename:表示选取此节点的所有子节点 /    : 表示从根节点选取 //   :选择 ...

  6. Java高级架构师(一)第14节:新增和列表页面和分页tag

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  7. phpMyAdmin 个性化设置,字体大小设置,去掉“以树形显示数据库”,禁用“发送错误报告”

    个性化设置phpMyAdmin 在使用phpMyAdmin 3.5.8.2时,发现: 如果数据库有相同的前缀,左边数据库导航会把前缀合并,即所谓的“以树形显示数据库”,真的有点不习惯,如下图所示: 不 ...

  8. windbg --sqlserver 实例 转

    http://blog.csdn.net/obuntu/article/details/5962378 SQLSERVER DUMP 调试 在下面的对话框输入 ~ 会出现线程的信息 0:000> ...

  9. Matlab图形中输入希腊字母

    xlabel('\beta'); ylabel('\delta'); 希腊字母等特殊字符用 \加拼音 如: α \alpha β \beta γ \gamma θ \theta Θ \Theta Г ...

  10. 网络采集软件核心技术剖析系列(3)---如何使用C#语言下载博文中的全部图片到本地并可以离线浏览

    一 本系列随笔概览及产生的背景 本系列开篇受到大家的热烈欢迎,这对博主是莫大的鼓励,此为本系列第三篇,希望大家继续支持,为我继续写作提供动力. 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受 ...