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

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

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

在这里插入图片描述

在这里插入图片描述

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

Java虚拟机栈是什么

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

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

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

存储类型

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

虚拟机栈的运行原理

在这里插入图片描述
在这里插入图片描述

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

注意

扫描二维码关注公众号,回复: 11067135 查看本文章

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

栈帧的内部结构概览

在这里插入图片描述

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

在这里插入图片描述
我们看一下局部变量表这个数字数组保存的信息有哪些?

在这里插入图片描述

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

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

在这里插入图片描述
在这里插入图片描述

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

写在最后

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

在这里插入图片描述

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

发布了39 篇原创文章 · 获赞 19 · 访问量 1466

猜你喜欢

转载自blog.csdn.net/weixin_44222272/article/details/105562502
今日推荐