当前位置:网站首页>JVM(5):虚拟机栈、栈异常、栈的存储结果和运行原理、栈内部结构、局部变量表
JVM(5):虚拟机栈、栈异常、栈的存储结果和运行原理、栈内部结构、局部变量表
2022-06-11 04:05:00 【游王子】
一、虚拟机栈
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。
优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。
有不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中的内存区理解为仅有Java堆(heap)和Java栈(stack)?为什么?
栈是运行时的单位,而堆是存储的单位。即:栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放、放在哪儿。

Java虚拟机栈是什么?
Java虚拟机栈(Java virtual Machine stack),早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(stack Frame),对应着一次次的Java方法调用。是线程私有的。
生命周期
生命周期和线程一致。
作用
主管Java程序的运行,它保存方法的局部变量(8个基本数据类型、对象的引用地址)、部分结果,并参与方法的调用和返回。


二、栈异常有哪些
栈中可能出现的异常
Java虚拟机规范允许Java栈的大小是动态的或者是固定不变的。
如果采用固定大小的Java虚拟机栈,那每一个线程的Java虚拟机栈容量可以在线程创建的时候独立选定。如果线程请求分配的栈容量超过Java虚拟机栈允许的最大容量,Java虚拟机将会抛出一个stackoverflowError异常。
如果Java虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机将会抛出一个outOfMemoryError异常。
设置栈内存大小
我们可以使用参数-Xss 选项来设置线程的最大栈空间,栈的大小直接决定了函数调用的最大可达深度。
设置线程堆栈大小(以字节为单位)。k或k表示KB, m或M表示MB, a或s表示GB。默认值取决于平台:
- Linux/x64(64 位):1024 KB
- macos(64 位):1024 KB
- Oracle Solaris/x64(64位):1024kb
- Windows:默认值取决于虚拟内存
下面的示例以不同的单位将线程堆栈大小设置为1024kb:
-Xss 1m
-Xss 1024k
-Xss 1048576默认栈大小测试代码:
public class StackErrorTest {
private static int count = 1;
public static void main(String[] args) {
System.out.println(count++); // 结果:9718
main(args);
}
}设置栈大小,添加VM参数:

再次执行测试代码:

三、栈的存储结构和运行原理
栈中存储什么?
- 每个线程都有自己的栈,栈中的数据都是以栈帧(stack Frame)的格式存在。
- 在这个线程上正在执行的每个方法都各自对应一个栈帧(stack Frame) 。
- 栈帧是一个内存区块,是一个数据集,维系着方法执行过程中的各种数据信息。
JVM直接对Java栈的操作只有两个,就是对栈帧的压栈和出栈,遵循“先进后出”/“后进先出”原则。
在一条活动线程中,一个时间点上,只会有一个活动的栈帧。即只有当前正在执行的方法的栈帧(栈顶栈帧)是有效的,这个栈帧被称为当前栈帧(current Frame),与当前栈帧相对应的方法就是当前方法(CurrentMethod),定义这个方法的类就是当前类(current class) 。
执行引擎运行的所有字节码指令只针对当前栈帧进行操作。
如果在该方法中调用了其他方法,对应的新的栈帧会被创建出来,放在栈的顶端,成为新的当前帧。

测试代码:
public class StackFrameTest {
public static void main(String[] args) {
new StackFrameTest().method1();
}
public void method1() {
System.out.println("method1()开始执行");
method2();
System.out.println("method1()结束");
}
public void method2() {
System.out.println("method2()开始执行");
method3();
System.out.println("method2()结束");
}
public void method3() {
System.out.println("method3()开始执行");
}
}

不同线程中所包含的栈帧是不允许存在相互引用的,即不可能在一个栈帧之中引用另外一个线程的栈帧。
如果当前方法调用了其他方法,方法返回之际,当前栈帧会传回此方法的执行结果给前一个栈帧,接着,虚拟机会丢弃当前栈帧,使得前一个栈帧重新成为当前栈帧。
Java方法有两种返回函数的方式,一种是正常的函数返回,使用return指令;另外一种是抛出异常。不管使用哪种方式,都会导致栈帧被弹出。
四、栈帧的内部结构
每个栈帧中存储着:
- 局部变量表(Local variables)
- 操作数栈〈operand stack)(或表达式栈)
- 动态链接( Dynamic Linking)(或指向运行时常量池的方法引用》
- 方法返回地址(Return Address)(或方法正常退出或者异常退出的定义)
- 一些附加信息


五、局部变量表
局部变量表也被称之为局部变量数组或本地变量表。
定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddress类型。
由于局部变量表是建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题
局部变量表所需的容量大小是在编译期确定下来的,并保存在方法的code属性的maximum local variables数据项中。在方法运行期间是不会改变局部变量表的大小的。
方法嵌套调用的次数由栈的大小决定。一般来说,栈越大,方法嵌套调用次数越多。对一个函数而言,它的参数和局部变量越多,使得局部变量表膨胀,它的栈帧就越大,以满足方法调用所需传递的信息增大的需求。进而函数调用就会占用更多的栈空间,导致其嵌套调用次数就会减少。
局部变量表中的变量只在当前方法调用中有效。在方法执行时,虚拟机通过使用局部变量表完成参数值到参数变量列表的传递过程。当方法调用结束后,随着方法栈帧的销毁,局部变量表也会随之销毁。
边栏推荐
- GPS Beidou time service, NTP makes network clock synchronization more accurate
- After the college entrance examination, what can I do and how should I choose my major-- From the heart of a college student
- 为了实现零丢包,数据中心网络到底有多拼?
- Lexical analyzer for compiling principle notes
- Embedded basic interface-i2c
- Exploitation and utilization of clickjacking vulnerability
- 邪恶的CSRF
- Market prospect analysis and Research Report of Ethernet scanner in 2022
- 7. list label
- FreeRTOS startup - based on stm32
猜你喜欢

给你一个项目,你将如何开展性能测试工作?

数据类型的转换和条件控制语句

Google 有哪些牛逼的开源项目?

JVM(6):Slot变量槽、操作数栈、代码追踪、栈顶缓存技术

Samsung Galaxy S21 ultra and Apple iPhone 13 Pro Max: which one should you choose

Safe and borderless, Guanghe tongdai 5g module +ai intelligent security solution shines at CPSE Expo

JVM(7):动态链接、方法的调用、四种方法调用指令区分非虚方法和虚方法、invokedynamic指令的使用

Zhongang Mining: fluorochemical industry is the main consumption field of fluorite

Guanghetong 5g module shines brightly and has won the "2021 science and technology award of China Electronics Society"

Maui migration guide
随机推荐
Embedded basic interface-i2s
数据分析师必知必会的统计学知识
Radar emitter modulation signal simulation (code)
ESP8266_ RTOS modifies IP address and hostname in AP mode
Detailed explanation of network time synchronization (NTP network timing) of video monitoring system
Pictures that make people feel calm and warm
Market prospect analysis and Research Report of hydrogen liquefier in 2022
Feature selection algorithm based on bare bones particleswarm optimization
A. Prefix range (C language)
再聊数据中心网络
Vulkan-官方示例解读-RayTracingShadows&在这里边使用模型(1)
Market prospect analysis and Research Report of surround packing machine in 2022
给你一个项目,你将如何开展性能测试工作?
2022 love analysis · privacy computing vendor panoramic report | love Analysis Report
Feature selection algorithm based on bare bones particleswarm optimization
合理使用线程池以及线程变量
Eth Of Erc20 And Erc721
Programming battle -- challenging college entrance examination questions
NTP time server (GPS Beidou satellite synchronous clock) application boiler monitoring system
PHP正则用例