返回
JVM入门学习日记(day05) -- 虚拟机栈概述
后端
2023-11-03 10:05:35
JVM入门学习日记(day05) -- 虚拟机栈概述
1. 虚拟机栈概述
1.1 概述
Java虚拟机栈(Java Virtual Machine Stack)是Java虚拟机运行时数据区的一部分。虚拟机栈是为执行Java方法而创建的,每个Java线程都有自己的虚拟机栈,而虚拟机栈包含一组栈帧(Stack Frame)。当一个方法开始执行时,就会创建一个栈帧并把它推入虚拟机栈。当方法执行完成后,栈帧就会被弹出。
1.2 特点
- 每个Java线程都有一个私有的虚拟机栈。
- 虚拟机栈由栈帧组成。
- 栈帧是用来存储方法的局部变量、操作数和中间结果的。
- 栈帧的生命周期与方法的生命周期相同。
- 虚拟机栈的大小是有限的,如果栈帧的大小超过了虚拟机栈的容量,就会发生栈溢出错误。
2. 虚拟机栈结构
虚拟机栈由栈帧组成。栈帧是一个数据结构,它包含以下信息:
- 局部变量表:存储方法的局部变量。
- 常量池引用:存储对常量池的引用。
- 操作数栈:存储操作数和中间结果。
- 返回地址:存储方法执行完成后要返回的地址。
- 其他信息:例如,方法的名称和参数。
3. 虚拟机栈运行方式
虚拟机栈按照后进先出的原则工作。当一个方法开始执行时,就会创建一个栈帧并把它推入虚拟机栈。当方法执行完成后,栈帧就会被弹出。
4. 方法调用和方法执行过程
当一个方法被调用时,就会创建一个栈帧并把它推入虚拟机栈。栈帧包含以下信息:
- 局部变量表:存储方法的局部变量。
- 常量池引用:存储对常量池的引用。
- 操作数栈:存储操作数和中间结果。
- 返回地址:存储方法执行完成后要返回的地址。
- 其他信息:例如,方法的名称和参数。
方法执行时,首先将参数压入操作数栈。然后,执行方法体中的指令。指令执行完成后,将结果压入操作数栈。最后,将返回地址压入操作数栈,并从虚拟机栈中弹出栈帧。
5. 局部变量表
局部变量表是栈帧的一部分。它存储方法的局部变量。局部变量表的大小是固定的,它在方法编译时就确定了。
6. 常量池
常量池是Java虚拟机运行时数据区的一部分。它存储字符串、数字、类和方法的引用等信息。常量池是共享的,所有线程都可以访问它。
7. 操作数栈
操作数栈是栈帧的一部分。它存储操作数和中间结果。操作数栈的大小是固定的,它在方法编译时就确定了。
8. 栈帧
栈帧是一个数据结构,它包含以下信息:
- 局部变量表:存储方法的局部变量。
- 常量池引用:存储对常量池的引用。
- 操作数栈:存储操作数和中间结果。
- 返回地址:存储方法执行完成后要返回的地址。
- 其他信息:例如,方法的名称和参数。
栈帧的生命周期与方法的生命周期相同。
9. 堆栈溢出
如果栈帧的大小超过了虚拟机栈的容量,就会发生栈溢出错误。栈溢出错误是一个严重的错误,它会导致程序崩溃。
10. 总结
本章主要介绍了Java虚拟机运行时数据区之一--虚拟机栈,包括概述、结构、运行方式、方法调用和方法执行过程、局部变量表、常量池、操作数栈、栈帧、堆栈溢出等内容。