Java虚拟机(JVM)堆栈区域

每一根线, JVM 在创建线程时创建一个单独的堆栈。Java虚拟机堆栈的内存不需要是连续的。Java虚拟机只直接在Java堆栈上执行两个操作:推送和弹出帧。特定线程的堆栈可以称为 运行时堆栈 .该线程执行的每个方法调用都存储在相应的运行时堆栈中,包括参数、局部变量、中间计算和其他数据。完成一个方法后,从堆栈中删除相应的条目。完成所有方法调用后,堆栈变为空,在终止线程之前,JVM会销毁空堆栈。存储在堆栈中的数据可用于相应的线程,而不可用于其余的线程。因此,我们可以说本地数据是线程安全的。堆栈中的每个条目都被调用 堆叠框架 激活记录 .

null

Java-Stack

堆栈框架结构 堆栈框架基本上由 部分: 局部变量数组、操作数堆栈和帧数据 .当JVM调用Java方法时,它首先检查类数据以确定字数 (局部变量数组和操作数堆栈的大小 每种方法的用词量) 局部变量数组和操作数堆栈中的方法所需。它为调用的方法创建一个大小合适的堆栈框架,并将其推送到Java堆栈上。

1.局部变量数组(LVA):

  • 堆栈框架的局部变量部分被组织为一个基于零的单词数组。
  • 它包含该方法的所有参数和局部变量。
  • 数组中的每个插槽或条目都有4个字节。
  • int、float和reference类型的值在数组中占据1个条目或插槽,即4个字节。
  • double和long的值占据数组中的两个连续条目,即总共8个字节。
  • 字节,短 , 和char值将在存储之前转换为int类型 并占用1个插槽,即4个字节。
  • 但存储布尔值的方式因JVM而异。但大多数JVM在局部变量数组中为布尔值提供1个槽。
  • 参数首先按声明顺序放入局部变量数组。
  • 例如: 让我们考虑一个具有一个方法的类例子。 自行车 然后局部变量数组将如下图所示:
// Class Declarationclass Example{  public void bike(int i, long l, float f,                double d, Object o, byte b)  {      } }     

Local Variable Array for bike()

2.操作数堆栈(OS):

  • JVM使用操作数堆栈作为工作空间,就像粗糙的工作,或者我们可以说用于存储中间计算的结果。
  • 操作数堆栈被组织为一个字数组,就像局部变量数组一样。但这不是通过使用类似索引的局部变量数组来访问的,而是通过一些可以将值推送到操作数堆栈的指令、一些可以从操作数堆栈弹出值的指令以及一些可以执行所需操作的指令来访问的。
  • 例如: 以下是JVM如何使用下面的代码,将包含两个整数的两个局部变量相减,并将整数结果存储在第三个局部变量中:

Assembly Code Instruction for Operand Stack

  • 这里有前两条说明 iload_0 iload_1 将从局部变量数组中推送操作数堆栈中的值。和指导 isub 将这两个值相减,并将结果存储回操作数堆栈 史前2 结果将从操作数堆栈中弹出,并存储到位置2的局部变量数组中。

Working of LVA and OS

3.帧数据(FD):

  • 它包含所有符号引用( 恒定池分辨率) 以及与特定方法相关的普通方法返回。
  • 它还包含对异常表的引用,该表在异常情况下提供相应的捕获块信息。
© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享