`
flamezealot
  • 浏览: 20905 次
  • 性别: 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反汇编插件

    【标题】:JVM反汇编插件 在Java虚拟机(JVM)的世界里,JIT(Just-In-Time)编译器扮演着至关重要的角色,它负责将字节码转化为机器码,以提高程序的运行效率。为了深入理解JVM内部的工作机制,特别是JIT编译器...

    框架->java语言->jvm->os->汇编->硬件

    3. **JVM(Java虚拟机)**:JVM是Java程序的执行环境,它将Java字节码转换为特定平台的机器码,实现了跨平台运行。了解JVM包括内存模型(堆、栈、方法区等)、垃圾回收机制、类加载过程、性能优化等方面。 4. **...

    jvm反汇编插件hsdis

    为了优化性能和进行故障排查,开发者有时需要查看JVM内部的运作机制,而HSDis就是这样一个强大的工具,它是一款JVM反汇编插件,能够帮助我们窥探Java字节码在实际执行时被转换成的机器码。 HSDis全称为HotSpot ...

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

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

    慢慢琢磨jvm 经典

    这一过程涉及JVM的内部指令集,类似于不同CPU系列的汇编语言,但具有跨平台兼容性。 #### 存储管理:内存中的虚拟世界 JVM的存储部分尤为重要,尤其是对于程序的健壮性和效率而言。与硬盘存储无关,JVM的存储机制...

    Java JVM Instruction Set

    可以使用`javap`工具来反汇编已编译的Java类文件,查看字节码指令。例如,如果想要检查`X.class`文件中的字节码,可以使用命令: ```bash % javap -c X.class ``` ##### main()函数的局部变量部分 `main()`函数...

    查看运行代码的汇编指令的工具

    `javap`是Java虚拟机(JVM)的一部分,通过反编译Class文件,我们可以看到方法的原始字节码以及解释为的汇编指令。这个工具对于性能调优、理解和分析JVM的工作机制非常有用。 使用`javap`的基本语法是: ```bash ...

    JVM指令

    - **jad**:JaCoCo的反汇编器,提供了更详细的字节码分析功能。 - **IntelliJ IDEA或Eclipse插件**:这些集成开发环境通常有内置的字节码查看器,方便在调试过程中查看字节码。 ### 4. 优化JVM指令 通过优化JVM...

    java反汇编软件可以反汇编class文件

    Java程序首先由Java编译器转化为字节码(.class文件),这是一种中间语言,不依赖于特定的硬件架构,可以在任何支持Java虚拟机(JVM)的平台上运行。然而,字节码并不像源代码那样易于理解和修改。反汇编就是将这种...

    查看汇编的工具.zip

    在Java世界中,JVM(Java虚拟机)负责将Java字节码解释或编译成特定平台的机器码,而汇编语言是这种机器码的抽象表示。通过查看汇编代码,开发者可以深入了解JVM内部的工作机制,优化性能敏感的代码,或者调试某些低...

    java 反汇编

    反汇编则更侧重于查看和理解字节码指令,这些指令是Java虚拟机(JVM)执行的低级语言。在这里,我们将深入探讨Java反汇编的概念、工具以及如何利用它来增强我们的编程能力。 首先,我们需要理解Java字节码的重要性...

    00-JVM指令手册.pdf

    在Java源代码编译成.class文件后,其中包含的Java字节码指令可通过Java的反汇编工具(如javap)转换为人类可读的文本形式。本手册将指导读者理解这些字节码指令的意义以及它们如何操作Java虚拟机的栈、局部变量、...

    java反汇编工具

    Java反汇编工具是开发者在调试和理解Java字节码时的重要辅助软件。标题提到的“java反汇编工具”通常是指能够将编译后的Java类文件(.class文件)转换回可读性较高的源代码表示形式的工具,这对于查看没有源代码的库...

    半栈工程师.JVM之模板解释器 - 知乎1

    总结来说,模板解释器是HotSpot JVM优化执行性能的一种策略,通过预编译字节码指令为汇编代码,减少了运行时的解释开销,提升了Java程序的运行效率。这一技术体现了Java开发者对性能优化的不断追求,也是现代JVM设计...

    jvm解析编译过的class文件

    例如,`javap`是Java自带的反汇编工具,可以查看编译后的字节码和相关的元数据。通过`javap -c TestClass`,我们可以看到TestClass类的方法定义和字节码指令。 另外,` jclasslib`是一款可视化的字节码查看器,它...

    java和汇编源程序

    2. 平台无关性:Java通过Java虚拟机(JVM)实现了跨平台运行的能力,代码编译成字节码后可以在任何安装了JVM的系统上运行。 3. 自动内存管理:Java有内置的垃圾回收机制,自动管理内存,降低了程序员处理内存泄漏的...

    简易java反汇编工具

    在Java领域,JVM(Java虚拟机)执行的是字节码,这是一种中间语言,而不是直接的机器代码。本文将详细介绍如何使用简易Java反汇编工具来解析和理解这些字节码。 首先,Java反汇编工具有多种,如JAD(Java ...

    Java查看汇编指令工具(32位、64位)win系统.7z

    要查看Java的汇编指令,我们需要一个能够解析JVM字节码并展示其对应汇编代码的工具。一个常用的工具是JITWatch,它是由Adobe开发的一个Java即时编译器(JIT)分析工具。JITWatch可以显示由JIT编译器生成的热点代码...

Global site tag (gtag.js) - Google Analytics