第10章 栈和局部变量操作
由于java虚拟机是基于栈的机器,几乎所有java虚拟机的指令都与操作数栈有关;绝大多数指令都会在执行自己功能的时候进行入栈、出栈操作。
常量入栈操作:操作码在执行常量入栈操作之前,使用三种方式指明常量的值:常量值隐式包含在操作码内部、常量值在字节码流中如同操作数一样紧随在操作码之后、或者从常量池中取出常量。
一些操作码自行指明入栈的常量的类型和值,相对于从字节码流中取出操作数或者指向常量池的指令来说,这种指令都是冗余指令,但它们更有效率。这种指令在字节码流中仅仅占据一个字节的空间。
java栈中的每一个位置的长度都是一个字长(至少32为宽)。 每当一个int或者float类型被压入栈时,它都将占据一个位置。
每当一个long或者double类型的值被压入栈时,它都将占据2个位置。
aconst_null操作码将一个空的对象引用类型压入栈。给一个对象赋空值的过程中,将会使用该指令。
byte和short数据类型入栈,整数常量的值必须在byte和short的有效范围之内。紧随操作码的byte或short类型在压入栈之前被扩展成int类型值,将int类型值压入栈的操作实际上取代了将byte和short类型值压入栈的操作。
从常量池取出常量的操作码使用表示常量池索引的操作数,java虚拟机通过给定的索引查找相应的常量池入口,决定这些常量的类型和值,并把它们压入栈。常量池索引是一个无符号值,在字节码流中紧随在操作码后面。
ldc和ldc_w两个操作码把一个字长的项压入栈,该项或者是一个int、float类型的值,或者是一个String类型的对象引用。ldc的索引只有一个字节,只能指向常量池中的1-255(0位置没有使用)范围内的位置。ldc_w有两个字节长度的索引,因此,它能指向任何包含long或double类型(占据两个字节)的常量池位置。
java源码中的所有字符串文字最终都作为入口存储在常量池中,如果同一个应用的多个类使用相同序列的字符串文字,那么此字符串文字将在它的所有类的class文件中出现;java虚拟机解析一个字符串文字的常量池入口时,它“拘留”(intern)这个字符串,这样其他类在解析这个字符串时直接返回被拘留的字符串文字引用,而不会新建一个字符串对象。
通用栈操作:尽管java虚拟机指令集中的大多数指令只处理一种特定的类型,但还是有一些指令可以今夕类型无关的栈操作;这些通用指令不能用于分解两个字长的值。
局部变量入栈:一些操作码隐式地指向一个通常使用的局部变量位置;而其他局部变量则被一个紧随操作码后的第一个字节位置所代表局部变量索引的操作码压入栈。
int和float类型的局部变量入栈:
long和double类型的局部变量入栈:这种指令从栈帧的局部变量区向操作数栈移动了两个字长的数据。
对象引用(占据一个字长)从栈帧的局部变量区向操作数栈移动:
弹出栈顶部元素,将其赋值给局部变量:对于每个将局部变量压入栈的操作码,都存在对应的弹出栈顶部元素并将其存储到局部变量中的操作码。
int和float类型出栈操作码:从操作数栈顶部向局部变量移动一个字长的值。
long和double类型出栈操作码:从操作数栈顶部向局部变量移动两个字长的值。
对象引用出栈操作数码:从操作数栈顶部弹出一个对象引用,并将其存储到局部变量中。
相关推荐
虚拟机栈区是 JVM 的一个私有内存区域,每个线程都需要有一个独立的虚拟机栈,用于存储局部变量、操作数栈、动态链接、方法出口等信息。虚拟机栈的生命周期与线程相同,每个方法从调用直至执行完成的过程,就对应着...
深入理解 Java 虚拟机笔记 Java 虚拟机(JVM)是 Java 语言的运行环境,它负责解释和执行 Java 字节码。下面是 Java 虚拟机相关的知识点: 虚拟机内存结构 Java 虚拟机的内存结构主要包括以下几个部分: * 方法...
1. **Java虚拟机栈**:每一个线程都有自己的虚拟机栈,用于存储方法执行的局部变量表、操作数栈、动态链接、方法出口等信息。 2. **本地方法栈**:与Java虚拟机栈类似,但它用来支持本地方法调用。 #### 五、基本...
- **虚拟机栈**:每个线程拥有一个独立的栈,栈中保存了方法执行的局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从执行到结束的过程都对应着一个栈帧在栈中的入栈和出栈过程。 - **本地方法栈**:与...
- 栈帧包含了局部变量表、操作数栈、动态链接信息及方法返回地址等信息。 - 主要用于支持Java方法的执行。 3. **本地方法栈**: - 类似于Java虚拟机栈,但是服务于本地方法调用。 - 具体实现方式取决于具体的...
- **功能**: 每个线程都有自己的栈,用于存储局部变量和方法调用状态。 - **生命周期**: 与线程的生命周期一致。 - **异常**: 如果线程请求的栈深度大于虚拟机允许的最大深度,则会抛出`StackOverflowError`异常。 ...
2. 虚拟机栈(VM Stack):每个线程私有的,线程在运行时,在执行每个方法的时候都会打包成一个栈帧,存储了局部变量表,操作数栈,动态链接,方法出口等信息,然后放入栈。每个时刻正在执行的当前方法就是虚拟机...
堆内存用于存储对象实例,而栈内存则保存线程局部变量。另外,还有方法区(或称为元空间)用于存储类信息,本地方法栈服务于JNI(Java Native Interface)调用的本地方法。 3. **指令解释和执行**:JVM通过字节码...
每当一个方法被调用时,系统就会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。方法执行结束,对应的栈帧被销毁。 方法区存放了被JVM加载的类信息、常量、静态变量等数据。...
- 栈内存:每个线程都有自己的虚拟机栈,用于存储局部变量、方法参数和运算结果。 - 方法区:存储类信息、常量、静态变量等。 3. **垃圾回收** - 垃圾收集器:如Serial、ParNew、Parallel Scavenge、CMS、G1等,...
2. **虚拟机栈**:每个线程都有自己的虚拟机栈,当执行方法时,会创建一个栈帧,包含局部变量表、操作数栈、动态链接和方法出口等信息。栈帧随着方法调用的开始和结束而入栈和出栈。 3. **本地方法栈**:与虚拟机栈...
虚拟机栈是 Java 虚拟机中的一种数据结构,用于存储方法的局部变量、方法参数和返回值等信息。它的特点是线程私有,每个线程都有自己的虚拟机栈。 2.2 作用 虚拟机栈的作用是存储方法的局部变量、方法参数和返回值...
它用来描述Java方法执行的内存模型,每个方法被执行时都会创建一个栈帧来存储局部变量表、操作数栈、动态链接、方法出口等信息。方法执行过程即为栈帧的入栈和出栈过程。 - **局部变量表**: 存储方法参数和方法内部...
“尚硅谷JAVA基础笔记”涵盖了Java语言的基础知识,包括语言概述、基本语法、面向对象概念、封装、继承和多态,以及一些关键概念如形参与实参、属性与局部变量、构造器、this关键字、包和MVC设计模式的使用。...
栈帧是虚拟机栈的一个元素,用于存储局部变量表、操作数栈、动态链接、方法返回地址以及额外运行时信息。当一个方法被调用时,一个新的栈帧会被创建并推入虚拟机栈;当方法执行完毕,对应的栈帧会被弹出销毁。 栈...
局部变量表用于存储方法的局部变量和参数,操作数栈则用于计算和临时存储数据。动态链接指的是栈帧对运行时常量池的引用,便于方法调用过程中的符号解析。 【内存布局】 在Java对象的内存布局中,堆内存是分配给...
在Java的世界里,类型安全至关重要,尤其是在多线程环境下,防止非法的类型访问和操作能避免潜在的安全风险和程序崩溃。 栈校验机制主要是为了执行字节码时检查操作数栈中的数据类型是否符合Java语言规范。在JVM的...
这些集合允许我们高效地存储和操作数据。并发修改异常(ConcurrentModificationException)通常发生在迭代集合时尝试修改集合内容。为了避免这种异常,可以使用`ListIterator`或者在修改集合时使用`...