`

jvm编译时自动生成的局部变量

    博客分类:
  • java
JVM 
阅读更多
每个方法调用都会产生一个新的栈帧,每个java栈帧存储三部分内容:
1、局部变量区,主要是存储方法参数和方法内部声明局部变量。jvm编译成的class文件中,Code属性的max_locals指出一共有多少个局部变量。局部变量的详细信息都在code属性的local attribute table有列出。
2、操作数栈,压栈出栈就是操作的这个栈。一般情况下,这个栈的最大深度都不是很大,可以随便找个class文件看看code属性的max_stack的值。可能受到参数个数的影响,其它也不知道了。
3、帧数据区,主要是有到常量池的引用、帮助方法调用返回时恢复发起调用的栈帧、到异常表的引用。

局部变量区的变量,一般都是自己在代码里边声明的变量,但是有些情况下你会发现,max_locals的值却比local attribute table的表项多,莫非是jvm在编译class文件的时候自动生成的局部变量(不知道这样理解是否正确)?不过从class文件的操作指令看,的确是操作了local attribute table中不存在的变量。例如:
	public static int testFinally() {
		int i = 3;
		try {
			return i;
		}  finally {
			i++;
		}
	}

生成的字节码:
 // Stack: 1, Locals: 3
  public static int testFinally();
     0  iconst_3
     1  istore_0 [i]
     2  iload_0 [i]
     3  istore_2 //存储到局部变量2   
     4  iinc 0 1 [i]
     7  iload_2  //从局部变量2中装载
     8  ireturn
     9  astore_1 //存储到局部变量1
    10  iinc 0 1 [i]
    13  aload_1  //从局部变量1中装载
    14  athrow
      Exception Table:
        [pc: 2, pc: 4] -> 9 when : any
      Line numbers:...
      Local variable table:
        [pc: 2, pc: 15] local: i index: 0 type: int
      Stack map table: number of frames 1
        [pc: 9, full, stack: {java.lang.Throwable}, locals: {int}]

local variable table只有一项,但是字节码中却操作了三个局部变量
1
0
分享到:
评论

相关推荐

    慢慢的回味.entry_point–JVM Java栈桢的创建1

    * 局部变量数组(Local Variables):存储方法的局部变量的值。 * 操作数栈(Operand Stack):存储方法执行过程中的操作数。 * 方法返回地址(Return Address):存储方法返回时的地址。 * 动态链接(Dynamic Link...

    JVM 原理及工作机制

    - **栈**:每个线程都有自己的操作栈,用于存储局部变量和运算过程中的数据。 - **垃圾回收堆**:JVM负责内存管理,其中垃圾回收机制自动回收不再使用的对象,避免内存泄漏。 - **方法域**:存储类的静态变量和...

    JVM原理讲解和调优,详细讲解JVM底层

    栈负责存储局部变量和方法调用的状态,每个线程都会有一个自己的栈。本地方法栈与栈类似,但是它服务于native方法的调用。方法区则用于存储已被虚拟机加载的类信息、常量、静态变量等数据。 JVM的垃圾回收机制是...

    jvm的基本原理及结构

    3. **类执行机制**:加载到内存中的字节码由JVM执行引擎执行,执行过程涉及程序计数器和栈的使用,栈用于存储方法调用时的局部变量和中间计算结果。 #### 四、JVM执行过程中的核心概念 - **程序计数器(Program ...

    Java JVM Instruction Set

    当从`main()`函数中调用`Min()`函数时,JVM会创建一个新的栈帧来保存局部变量和参数,并跳转到相应的字节码位置继续执行。 ##### 访问Min()函数中的参数 由于JVM采用栈式架构,访问参数通常涉及从栈顶弹出值并加载...

    jVM学习笔记.ppt

    每个线程有自己的程序计数器和栈,栈又由一系列栈帧组成,每个栈帧包含局部变量区和操作数栈,用于存储方法的局部变量、参数和执行过程中的中间结果。 在内存管理方面,JVM内存主要分为堆、栈、本地方法栈和方法区...

    jvm指令手册

    1. **字节码**:Java源代码编译后生成的是字节码文件(.class),这些文件包含了可被JVM理解的二进制指令。每个字节码指令由一个单字节的操作码(opcode)和可能的参数组成。 2. **操作码**:JVM指令由操作码标识,...

    JVM

    2. **栈内存**:每个线程都有自己的栈,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。 3. **方法区**:存储类信息、常量、静态变量等,也称为永久代,在现代JVM中通常被元空间(Metaspace)替代。 ###...

    狂神说JVM探究.rar

    - Java虚拟机栈:每个方法对应一个栈帧,存储局部变量表、操作数栈、动态链接和方法出口等信息。 - 本地方法栈:与JVM栈类似,但服务于Java Native Interface(JNI)调用的本地方法。 - 堆内存:存放对象实例,...

    JVM原理.doc

    栈中每个栈帧对应一个方法调用,包含局部变量区和操作数栈,用于存储方法的局部变量、参数和中间计算结果。 JVM的内存管理主要关注堆和栈的管理。堆内存用于存储对象实例,分为新生代和旧生代,新生代进一步划分为...

    JVM指令集.zip

    - **数据操作指令**:包括加载(如`iload`、`fload`用于加载局部变量表中的整型和浮点型数据)、存储(如`istore`、`fstore`用于存储数据回局部变量表)、算术运算(如`iadd`、`imul`执行加法和乘法)和类型转换...

    JVM 完整深入解析.pdf

    运行时常量池是方法区的一部分,它存放编译期生成的各种字面量和符号引用,并在类加载后被存放至方法区的运行时常量池中。运行时常量池具备动态性,可以在运行期间添加新的常量。 #### 堆(Heap) 堆是JVM中最大的...

    反编译java语言生成的class文件

    这一步可能会根据反编译器的复杂程度有所不同,简单的工具可能只提供基本的语法结构,而更高级的工具如`JD-Core`和`Procyon`会尝试恢复更多的源代码结构,包括注释和局部变量。 4. **展示结果**:在`jd-gui`中,...

    JVM基础.doc

    - **工作内存**:每个线程的私有数据区域,存储线程局部变量等。 **锁与同步机制** 包括: - **volatile关键字**:确保对变量的修改对其他线程可见。 - **synchronized关键字**:控制多个线程对共享资源的访问。 - ...

    JVM的那些事.pptx

    局部变量区用于存储局部变量和方法参数;操作数栈用于存放计算过程中的中间结果。 - **垃圾回收**:管理内存中的对象生命周期,自动回收不再使用的对象,避免内存泄漏。 #### 四、JVM参数配置及优化 为了更好地...

    11丨即时编译:高性能JVM的核心秘密1

    例如,避免过于复杂的循环结构,利用局部变量缓存重复计算的结果,以及适当地使用标量替换等技术,都有助于提升代码在JIT编译后的性能。 了解这些核心知识后,当遇到像Java中的桥接方法(Bridge Methods)这类抽象...

    jad 编译.class文件成java源文件

    由于字节码是低级的机器无关表示,反编译过程中可能会丢失一些源代码级别的信息,如原始注释、变量名和方法名。但是,JAD会尽可能地恢复这些信息,生成的Java源代码在大多数情况下仍然可以提供有价值的见解。 描述...

    JVM指令集 PDF 下载

    这些指令在Java源代码被编译成.class文件时生成,每个类文件包含了一个方法区、一个堆、一个栈以及若干个本地方法栈。字节码指令在JVM的解释器中被执行,使得Java程序能够在不同的操作系统上无缝运行。 1. **加载和...

    jvm原理及调优

    它主要用于存储局部变量、操作数栈、动态链接、方法出口等信息。栈帧(Stack Frame)是JVM栈的基本单位,用于保存方法执行时的信息。 ##### 3.3 堆(Heap) 堆是所有线程共享的内存区域,主要用于存储对象实例和数...

    JVM内幕:java虚拟机详解

    - 局部变量数组用于存储方法参数、局部变量以及`this`引用(对于实例方法)。对于基本数据类型和引用类型,每个变量占用一个槽位,而`long`和`double`类型占用两个连续的槽位。 7. **操作数栈(Operand Stack)** - ...

Global site tag (gtag.js) - Google Analytics