返回

JVM入门学习日记(day05) -- 虚拟机栈概述

后端

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虚拟机运行时数据区之一--虚拟机栈,包括概述、结构、运行方式、方法调用和方法执行过程、局部变量表、常量池、操作数栈、栈帧、堆栈溢出等内容。