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的指令集说明可以看这里
相关推荐
【标题】:JVM反汇编插件 在Java虚拟机(JVM)的世界里,JIT(Just-In-Time)编译器扮演着至关重要的角色,它负责将字节码转化为机器码,以提高程序的运行效率。为了深入理解JVM内部的工作机制,特别是JIT编译器...
3. **JVM(Java虚拟机)**:JVM是Java程序的执行环境,它将Java字节码转换为特定平台的机器码,实现了跨平台运行。了解JVM包括内存模型(堆、栈、方法区等)、垃圾回收机制、类加载过程、性能优化等方面。 4. **...
为了优化性能和进行故障排查,开发者有时需要查看JVM内部的运作机制,而HSDis就是这样一个强大的工具,它是一款JVM反汇编插件,能够帮助我们窥探Java字节码在实际执行时被转换成的机器码。 HSDis全称为HotSpot ...
课程简介: 目前,Java是最为流行的编程语言之一,它的基础平台就是JVM。除了Java,如JRuby、Scala、Clojure等语言也运行在JVM平台。...介绍JVM的字节码以及反汇编方法,同时介绍JIT相关的参数和应用。
这一过程涉及JVM的内部指令集,类似于不同CPU系列的汇编语言,但具有跨平台兼容性。 #### 存储管理:内存中的虚拟世界 JVM的存储部分尤为重要,尤其是对于程序的健壮性和效率而言。与硬盘存储无关,JVM的存储机制...
可以使用`javap`工具来反汇编已编译的Java类文件,查看字节码指令。例如,如果想要检查`X.class`文件中的字节码,可以使用命令: ```bash % javap -c X.class ``` ##### main()函数的局部变量部分 `main()`函数...
`javap`是Java虚拟机(JVM)的一部分,通过反编译Class文件,我们可以看到方法的原始字节码以及解释为的汇编指令。这个工具对于性能调优、理解和分析JVM的工作机制非常有用。 使用`javap`的基本语法是: ```bash ...
- **jad**:JaCoCo的反汇编器,提供了更详细的字节码分析功能。 - **IntelliJ IDEA或Eclipse插件**:这些集成开发环境通常有内置的字节码查看器,方便在调试过程中查看字节码。 ### 4. 优化JVM指令 通过优化JVM...
Java程序首先由Java编译器转化为字节码(.class文件),这是一种中间语言,不依赖于特定的硬件架构,可以在任何支持Java虚拟机(JVM)的平台上运行。然而,字节码并不像源代码那样易于理解和修改。反汇编就是将这种...
在Java世界中,JVM(Java虚拟机)负责将Java字节码解释或编译成特定平台的机器码,而汇编语言是这种机器码的抽象表示。通过查看汇编代码,开发者可以深入了解JVM内部的工作机制,优化性能敏感的代码,或者调试某些低...
反汇编则更侧重于查看和理解字节码指令,这些指令是Java虚拟机(JVM)执行的低级语言。在这里,我们将深入探讨Java反汇编的概念、工具以及如何利用它来增强我们的编程能力。 首先,我们需要理解Java字节码的重要性...
在Java源代码编译成.class文件后,其中包含的Java字节码指令可通过Java的反汇编工具(如javap)转换为人类可读的文本形式。本手册将指导读者理解这些字节码指令的意义以及它们如何操作Java虚拟机的栈、局部变量、...
Java反汇编工具是开发者在调试和理解Java字节码时的重要辅助软件。标题提到的“java反汇编工具”通常是指能够将编译后的Java类文件(.class文件)转换回可读性较高的源代码表示形式的工具,这对于查看没有源代码的库...
总结来说,模板解释器是HotSpot JVM优化执行性能的一种策略,通过预编译字节码指令为汇编代码,减少了运行时的解释开销,提升了Java程序的运行效率。这一技术体现了Java开发者对性能优化的不断追求,也是现代JVM设计...
例如,`javap`是Java自带的反汇编工具,可以查看编译后的字节码和相关的元数据。通过`javap -c TestClass`,我们可以看到TestClass类的方法定义和字节码指令。 另外,` jclasslib`是一款可视化的字节码查看器,它...
2. 平台无关性:Java通过Java虚拟机(JVM)实现了跨平台运行的能力,代码编译成字节码后可以在任何安装了JVM的系统上运行。 3. 自动内存管理:Java有内置的垃圾回收机制,自动管理内存,降低了程序员处理内存泄漏的...
在Java领域,JVM(Java虚拟机)执行的是字节码,这是一种中间语言,而不是直接的机器代码。本文将详细介绍如何使用简易Java反汇编工具来解析和理解这些字节码。 首先,Java反汇编工具有多种,如JAD(Java ...
要查看Java的汇编指令,我们需要一个能够解析JVM字节码并展示其对应汇编代码的工具。一个常用的工具是JITWatch,它是由Adobe开发的一个Java即时编译器(JIT)分析工具。JITWatch可以显示由JIT编译器生成的热点代码...