`
flamezealot
  • 浏览: 20044 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

jvm 汇编码

阅读更多
public class TestTryCatch {
    public static void main(String[] args) {
        TestTryCatch test = new TestTryCatch();
        System.out.println(test.fun());
        System.out.println(test.fun2());
    }

    public int fun() {
        int i = 10;
        try {
            return i;
        }  finally {
            i = 20;
        }
    }

    public StringBuilder fun2() {
        StringBuilder s = new StringBuilder("Hello");
        try {
            //doing something
            s.append("Word");
            return s;
        } catch (Exception e) {
            return s;
        } finally {
            s.append("finally");
        }
    }
}

 

javap -c TestTryCatch.class 之后,就可以看见了

 

 

Compiled from "TestTryCatch.java"
public class cn.com.flamezealot.base.jvm.trycatch.TestTryCatch {
  public cn.com.flamezealot.base.jvm.trycatch.TestTryCatch();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #1                  // class cn/com/flamezealot/base/jvm/trycatch/TestTryCatch
       3: dup
       4: invokespecial #16                 // Method "<init>":()V
       7: astore_1
       8: getstatic     #17                 // Field java/lang/System.out:Ljava/io/PrintStream;
      11: aload_1
      12: invokevirtual #23                 // Method fun:()I
      15: invokevirtual #27                 // Method java/io/PrintStream.println:(I)V
      18: getstatic     #17                 // Field java/lang/System.out:Ljava/io/PrintStream;
      21: aload_1
      22: invokevirtual #33                 // Method fun2:()Ljava/lang/StringBuilder;
      25: invokevirtual #37                 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      28: return

  public int fun();
    Code:
       0: bipush        10   10入栈顶
       2: istore_1           栈顶数据保存到局部变量数组第2个位置
       3: iload_1            取出第2个局部变量入栈顶
       4: istore        4    栈顶数据保存到第5个局部变量
       6: bipush        20   20入栈顶
       8: istore_1           栈顶数据保存到第2个局部变量
       9: iload         4    第5个局部变量入栈顶
      11: ireturn            返回
      12: astore_2           栈顶数据放到局部变量数组第3个位置
      13: iload_1            第2个局部变量的值放入栈顶
      14: istore        4    栈顶数据保存到第5个局部变量
      16: bipush        20   20入栈顶
      18: istore_1           保存到第2个局部变量
      19: iload         4    第5个局部变量值入栈顶
      21: ireturn            返回
      22: astore_3           栈顶数据放到局部变量数组第4个位置
      23: bipush        20   20入栈顶
      25: istore_1           保存到第2个局部变量
      26: aload_3            局部变量数组第4个位置数据入栈顶
      27: athrow             将栈顶的数值作为异常或错误抛出
    Exception table:
       from    to  target type
           3     6    12   Class java/lang/Exception
           3     6    22   any
          12    16    22   any

  public java.lang.StringBuilder fun2();
    Code:
       0: new           #52                 // class java/lang/StringBuilder
       3: dup                               复制一份对象引用,因为接下来要先初始化,再保存到变量,所以这里复制了一份
       4: ldc           #54                 // String Hello
       6: invokespecial #56                 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V   类初始化会弹出一个引用
       9: astore_1                          另一个引用存入局部变量表2号位置
      10: aload_1
      11: ldc           #59                 // String Word
      13: invokevirtual #61                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      16: pop                               这里返回值没有赋给任何变量,所以pop出栈
      17: aload_1
      18: astore        4
      20: aload_1
      21: ldc           #65                 // String finally
      23: invokevirtual #61                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      26: pop
      27: aload         4                    sotre、load的都是引用
      29: areturn
      30: astore_2
      31: aload_1
      32: astore        4
      34: aload_1
      35: ldc           #65                 // String finally
      37: invokevirtual #61                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      40: pop
      41: aload         4
      43: areturn                           每次return前都会执行fianlly里的方法
      44: astore_3
      45: aload_1
      46: ldc           #65                 // String finally
      48: invokevirtual #61                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      51: pop
      52: aload_3
      53: athrow                            异常处理前也会执行finally里的方法
    Exception table:
       from    to  target type
          10    20    30   Class java/lang/Exception
          10    20    44   any
          30    34    44   any
}

 

jvm的指令集说明可以看这里

https://docs.oracle.com/javase/specs/jvms/se8/jvms8.pdf

分享到:
评论

相关推荐

    深入JVM内核 - 原理、诊断与优化

    课程简介: 目前,Java是最为流行的编程语言之一,它的基础平台就是JVM。除了Java,如JRuby、Scala、Clojure等语言也运行在JVM平台。...介绍JVM的字节码以及反汇编方法,同时介绍JIT相关的参数和应用。

    中文版JVM指令手册.pdf

    根据官方jvm指令转化的中文版jvm指令手册,包含 java反汇编指令以及对应的机器码和操作的具体含义,对于英文吃力的人是一大福音。

    Lilac - a Java assembler:JVM(Java虚拟机)的汇编程序和反汇编程序-开源

    Lilac是一个工具套件,其中包含JVM(Java虚拟机)字节码的汇编程序和反汇编程序。 汇编程序采用以类似于汇编程序的语法编写的Java类的文本表示形式,并将它们转换为二进制Java类文件,然后可以将其加载到JVM中。 反...

    JVM指令集(1).docx

    jvm常用的指令,是分析字节码反汇编的必备指令 常用的指令 &gt; iconst_0 将int类型常量0压入栈 &gt; istore_1 将int类型值存入局部变量1 &gt; iconst_0 将int类型常量0压入栈 &gt; istore_2 将int类型值存入局部变量2 &gt; iload_1...

    Krakatau:Java反编译器,汇编器和反汇编器

    Krakatau的汇编器语法主要是Jasmin语法的超集,但有一些不兼容,但是与Jasmin不同,Krakatau完全支持所有Java 14功能,甚至还支持旧版本JVM中的一些未记录的功能。 Krakatau还提供了用于将Java二进制文件转换为可...

    smali中文手册.zip

    smali 和 baksmali 则是针对 DEX 执行文件格式的汇编器和反汇编器, 反汇编后 DEX 文件会产生.smali 后缀的代码文件, smali 代码拥有特定的格式与语法, smali 语言是对 Dalvik 虚拟机字节码的一种解释。

    toothpick:Clojure汇编程序套件

    Toothpick是一个工具包,用于从Clojure惯用地生成可检查的汇编程序字节码。 它旨在用于编译器和翻译器,但是真正冒险的人无疑可以执行手动代码生成并强制JVM执行结果。 牙签与臀部的,这是牙签的开发目标体系结构。...

    smali语法中文.doc

    smali 和 baksmali 则是针对 DEX 执行文件格式的汇编器和反汇编器, 反汇编后 DEX 文件会产生.smali 后缀的代码文件, smali 代码拥有特定的格式与语法, smali 语言是对 Dalvik 虚拟机字节码的一种解释。

    AlanCheen#ReadingNotes#第2章-Java并发机制的底层实现原理1

    第2章-Java并发机制的底层实现原理Java 代码在编译后会变成 Java 字节码,字节码被类加载器加载到 JVM 里,JVM 执行字节码,最终需要转化为汇编

    java后端源码-lljvm:低级Java虚拟机

    JVM 上运行相对低级的语言(例如 C)。 LLJVM 提供的 C 到 JVM 字节码编译涉及几个步骤。 源代码首先由前端(例如llvm-gcc或 . 然后将 LLVM IR 转换为汇编代码,链接到其他 Java 类,然后汇编为 JVM 字节码。 与使用...

    java jdk8 学习笔记

    可以这样想 :java 语言 -&gt;类文件(字节码文件)-&gt;汇编语言-&gt;二进制码) 4.大多数java标准版本平台都会取个代码名称(code name),如Java SE 7 dolphin(海豚) 5.从大到小,包含与被包含:java se:java 语言、jdk...

    Java Class Editor-开源

    一个Java类的assambler。 该程序为JVM汇编Java字节代码指令,如为CPU的MASM。 强烈需要Java字节码指令的知识。

    tdd-bytecode:带引导的 TDD Java 字节码

    tdd-字节码一个项目,演示了如何持续编译汇编程序并使用 Clojure 对其进行测试。 您可以使用这样的设置通过学习 Java 字节码。 使用和任务。开发第一次组装和测试: boot watch test然后,编辑并保存 - 您应该会再次...

    synchronize底层实现原理

    synchronize底层实现原理 Java文件想要看字节码通常使用 javap 命令将java的class文件反汇编,具体操作步骤如下:...经过以上3步骤,你会看到一些字节码指令,其实这才是最终运行在jvm上的机器指令代码。 public class

    AtX:elf将Arm32转换为X86_64

    我以前的本科学位论文具有与ARM体系结构相关的经验,这与之类似,只是将JVM字节码转换为ARM。 为此,我选择的工具是用于拆卸的用于elf标头的 ,然后决定使用进行输出:这样,我的翻译器将生成汇编程序,然后NASM会...

    GoCaml:将 Go-Lite(Go 的一个子集)编译为 Java 字节码的编译器

    然后使用 jasmin 汇编器将 .j 文件编译为字节码。 有几个预编译的 jvm 类为实现 go 数据结构提供运行时支持,在最后一步中,这些类被复制到 go 生成的类文件中。 依赖关系 OCaml(以及 ocamllex 和 ocamlbuild) ...

    Java虚拟机

    4.2.7 HSDIS:JIT生成代码反汇编 4.3 JDK的可视化工具 4.3.1 JConsole:Java监视与管理控制台 4.3.2 VisualVM:多合一故障处理工具 4.4 本章小结 第5章 调优案例分析与实战 5.1 概述 5.2 案例分析 5.2.1 高...

    积分java源码-Revature-Online-JAVA-Class-Repository:Revature-Online-JAVA-Cla

    高级:易于人类阅读的代码,与二进制或汇编相反。 编译型语言和解释型语言的混合体:人类可读的代码被编译或转换成一种更适合计算机阅读的形式 比如C++代码编译成二进制 另一方面,Java 代码被编译成 Java 字节码,...

    class2ir:Java 字节码 2 LLVM IR

    本项目是从类文件(Java字节码)到LL文件(LLVM IR汇编器)的编译器。 结果文件可以通过 llvm-as 编译为独立的二进制 ELF 文件。 特征: 没有JDK,没有JVM Linux x86_64 目标架构 极小的尺寸(~10-20 kB 普通程序...

    yarrow:[yarrow]基于JVMCI的HotSpot VM优化编译器

    多亏了 JVMCI,我可以使用-XX:+EnableJVMCI -XX:+UseJVMCICompiler -Djvmci.Compiler=yarrow选项在运行时轻松地将编译器插入JVM。 由于JVMCI是一项实验性功能,因此仅将其服务公开给Graal编译器后端(这是JVMCI的...

Global site tag (gtag.js) - Google Analytics