JVM运行时数据区之---虚拟机栈

JVM运行时数据区之—虚拟机栈

我们首先来看一下运行时数据区的大体结构 了解虚拟机栈处于运行时数据区的哪一部分

JVM运行时数据区之---虚拟机栈

JVM运行时数据区之---虚拟机栈

我们初步对于虚拟机栈有了一个了解 下面我们对它做一个深入一点的学习

Java虚拟机栈是什么

定义主管Java程序的运行,线程独享(私有)

生命周期 随着线程的创建而创建,随着线程的消亡而消亡,不会被GC回收

注意 每个线程在创建的时候都会创建一个虚拟机栈 每一个虚拟机栈的内部保存了一个个的栈帧 每一个栈帧对应着一次次的方法调用(在这个线程上执行的每一个方法都对应着一个栈帧

存储类型

  • 基本数据类型
  • 对象的引用类型
  • 局部变量
  • 实例方法(如main方法,在实例方法中存储相关的基本数据类型和引用类型)
  • 不论是基本数据类型还是对象的引用类型,都会在栈中分配一块内存,基本类型存的是基本类型的内容(如值),引用类型存的是指向该引用对象内容的指针,真正的内容存放在堆中

虚拟机栈的运行原理

JVM运行时数据区之---虚拟机栈
JVM运行时数据区之---虚拟机栈

先进后出,栈中的数据一般以栈帧的格式存储,一个实例方法作为一个栈帧,main方法在栈底,按照方法的调用顺序自下而上存放栈帧,每个方法执行的同时创建帧栈(Strack Frame)用于存储局部变量表(方法参数、局部变量)、操作栈(Operand Stack,记录出、入栈操作)、动态链接、方法出口等信息

注意

不同线程所包含的栈帧是不能够相互引用的 因为每一个虚拟机栈本身就是被每一个线程所私有的

栈帧的内部结构概览

JVM运行时数据区之---虚拟机栈

栈帧的内部结构之局部变量表

JVM运行时数据区之---虚拟机栈
我们看一下局部变量表这个数字数组保存的信息有哪些?

JVM运行时数据区之---虚拟机栈

局部变量表影响每一个栈帧的大小 局部变量表中的变量只在当前方法的调用中有效 方法调用结束后 随着方法栈帧的销毁 局部变量表也会随之销毁

我们看一下什么叫做方法调用结束之后 局部变量表的失效

JVM运行时数据区之---虚拟机栈
JVM运行时数据区之---虚拟机栈

也就是说 args这个形参 test这个对象 num这个变量 这三个东西在出了main方法的大括号之后就都会失效

写在最后

这篇仅仅只是分析了运行时数据区的虚拟机栈 关于栈帧也仅仅是分析了其局部变量表这个结构 笔者以后随着学习的深入会不断更新 最后我们在来用一个图回顾一下运行时数据区 虚拟机栈 栈帧 局部变量表的结构关系作为收尾

JVM运行时数据区之---虚拟机栈

最后 还是希望大家坚持下去 心想事成!