JVM运行时数据区之—虚拟机栈
我们首先来看一下运行时数据区的大体结构 了解虚拟机栈处于运行时数据区的哪一部分
我们初步对于虚拟机栈有了一个了解 下面我们对它做一个深入一点的学习
Java虚拟机栈是什么
定义
主管Java程序的运行,线程独享(私有)
生命周期
随着线程的创建而创建,随着线程的消亡而消亡,不会被GC回收
注意
每个线程在创建的时候都会创建一个虚拟机栈 每一个虚拟机栈的内部保存了一个个的栈帧 每一个栈帧对应着一次次的方法调用(在这个线程上执行的每一个方法都对应着一个栈帧
)
存储类型
- 基本数据类型
- 对象的引用类型
- 局部变量
- 实例方法(如main方法,在实例方法中存储相关的基本数据类型和引用类型)
- 不论是基本数据类型还是对象的引用类型,都会在栈中分配一块内存,基本类型存的是基本类型的内容(如值),引用类型存的是指向该引用对象内容的指针,真正的内容存放在堆中
虚拟机栈的运行原理
先进后出,栈中的数据一般以栈帧的格式存储,一个实例方法作为一个栈帧,main方法在栈底
,按照方法的调用顺序自下而上存放栈帧,每个方法执行的同时创建帧栈(Strack Frame)用于存储局部变量表(方法参数、局部变量)、操作栈(Operand Stack,记录出、入栈操作)、动态链接、方法出口等信息
注意
扫描二维码关注公众号,回复: 11067135 查看本文章不同线程所包含的栈帧是不能够相互引用的 因为每一个虚拟机栈本身就是被每一个线程所私有的
栈帧的内部结构概览
栈帧的内部结构之局部变量表
我们看一下局部变量表这个数字数组保存的信息有哪些?
局部变量表影响每一个栈帧的大小 局部变量表中的变量只在当前方法的调用中有效 方法调用结束后 随着方法栈帧的销毁 局部变量表也会随之销毁
我们看一下什么叫做方法调用结束之后 局部变量表的失效
也就是说 args这个形参 test这个对象 num这个变量 这三个东西在出了main方法的大括号之后就都会失效
写在最后
这篇仅仅只是分析了运行时数据区的虚拟机栈 关于栈帧也仅仅是分析了其局部变量表这个结构 笔者以后随着学习的深入会不断更新 最后我们在来用一个图回顾一下运行时数据区 虚拟机栈 栈帧 局部变量表的结构关系作为收尾
最后 还是希望大家坚持下去 心想事成!