资源网站建设wordpress 分类页 获取别名
- 作者: 五速梦信息网
- 时间: 2026年04月20日 05:03
当前位置: 首页 > news >正文
资源网站建设,wordpress 分类页 获取别名,安卓模仿网站开发详细教程,大型商城购物平台开发【1】概述
Java虚拟机栈#xff08;Java Virtual Machine Stack#xff09;#xff0c;早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈#xff0c;其内部保存一个个的栈帧#xff08;Stack Frame#xff09;#xff0c;对应着一次次的Java方法调用。
栈是运行…【1】概述
Java虚拟机栈Java Virtual Machine Stack早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈其内部保存一个个的栈帧Stack Frame对应着一次次的Java方法调用。
栈是运行时的单位而堆是存储的单位 栈解决程序的运行问题即程序如何执行或者说如何处理数据。堆解决的是数据存储的问题即数据怎么放放哪里 生命周期
栈是线程私有的生命周期和线程一致也就是线程结束了该虚拟机栈也销毁了。
作用
主管Java程序的运行它保存方法的局部变量8种基本数据类型、对象的引用地址、部分结果并参与方法的调用和返回。
局部变量它是相比于成员变量来说的或属性基本数据类型变量 VS 引用类型变量类、数组、接口
栈的特点
栈是一种快速有效的分配存储方式访问速度仅次于程序计数器。JVM直接对Java栈的操作只有两个
每个方法执行伴随着进栈入栈、压栈执行结束后的出栈工作对于栈来说不存在垃圾回收问题栈存在溢出的情况 栈中可能出现的异常
Java 虚拟机规范允许Java栈的大小是动态的或者是固定不变的。 如果采用固定大小的Java虚拟机栈那每一个线程的Java虚拟机栈容量可以在线程创建的时候独立选定。如果线程请求分配的栈容量超过Java虚拟机栈允许的最大容量Java虚拟机将会抛出一个StackoverflowError 异常。 如果Java虚拟机栈可以动态扩展并且在尝试扩展的时候无法申请到足够的内存或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈那Java虚拟机将会抛出一个 OutOfMemoryError 异常。
设置栈内存大小
我们可以使用参数 -Xss选项来设置线程的最大栈空间栈的大小直接决定了函数调用的最大可达深度
-Xss1m
-Xss1024k
-Xss1048576Java虚拟机(JVM)为每个线程分配一个独立的栈空间-Xss 参数用于设置每个线程的栈大小而不是整个JVM的栈空间大小。这个参数允许你调整每个线程的栈空间大小这对于控制内存消耗以及解决由于栈溢出错误如 StackOverflowError是非常有用的但是JVM并没有直接的参数来设置所有线程栈空间的总和。 【2】栈的存储单位
① 栈种存储什么
每个线程都有自己的栈栈中的数据都是以栈帧Stack Frame的格式存在。
在这个线程上正在执行的每个方法都各自对应一个栈帧Stack Frame。
栈帧是一个内存区块是一个数据集维系着方法执行过程中的各种数据信息。 ② 栈运行原理
JVM直接对Java栈的操作只有两个就是对栈帧的压栈和出栈遵循“先进后出”/“后进先出”原则。
在一条活动线程中一个时间点上只会有一个活动的栈帧。即只有当前正在执行的方法的栈帧栈顶栈帧是有效的这个栈帧被称为当前栈帧Current Frame与当前栈帧相对应的方法就是当前方法Current Method定义这个方法的类就是当前类Current Class。
执行引擎运行的所有字节码指令只针对当前栈帧进行操作。
如果在该方法中调用了其他方法对应的新的栈帧会被创建出来放在栈的顶端成为新的当前帧。
如下图所示每一个方法被执行则会对应入栈操作放到栈顶方法执行结束对应出栈操作改变栈顶栈帧。
不同线程中所包含的栈帧是不允许存在相互引用的即不可能在一个栈帧之中引用另外一个线程的栈帧。
如果当前方法调用了其他方法方法返回之际当前栈帧会传回此方法的执行结果给前一个栈帧。接着虚拟机会丢弃当前栈帧使得前一个栈帧重新成为当前栈帧。
Java方法有两种返回函数的方式一种是正常的函数返回使用return指令另外一种是抛出异常。不管使用哪种方式都会导致栈帧被弹出。
③ 栈帧的内部结构
每个栈帧中存储着
局部变量表Local Variables操作数栈Operand Stack或表达式栈动态链接DynamicLinking或指向运行时常量池的方法引用方法返回地址Return Address或方法正常退出或者异常退出的定义一些附加信息 也就是下图中的LV、OS、DL以及RA。
每个线程下的栈都是私有的也就是每个线程都有自己各自的栈。每个栈里面都有很多栈帧栈帧的大小主要由局部变量表 和 操作数栈决定的
如下所示一个线程通常会调用多个方法那么就会有多个栈帧。这种结构对于每个线程来说都是一样的。
【3】局部变量表
局部变量表Local Variables被称之为局部变量数组或本地变量表
定义为一个数字数组主要用于存储方法参数和定义在方法体内的局部变量。这些数据类型包括各类基本数据类型、对象引用reference以及returnAddress类型。
由于局部变量表是建立在线程的栈上是线程的私有数据因此不存在数据安全问题
局部变量表所需的容量大小是在编译期确定下来的并保存在方法的Code属性的maximum local variables数据项中。在方法运行期间是不会改变局部变量表的大小的。 方法嵌套调用的次数由栈的大小决定。一般来说栈越大方法嵌套调用次数越多。对一个函数而言它的参数和局部变量越多使得局部变量表膨胀它的栈帧就越大以满足方法调用所需传递的信息增大的需求。进而函数调用就会占用更多的栈空间导致其嵌套调用次数就会减少。
局部变量表中的变量只在当前方法调用中有效。在方法执行时虚拟机通过使用局部变量表完成参数值到参数变量列表的传递过程。当方法调用结束后随着方法栈帧的销毁局部变量表也会随之销毁。
public static void main(String[] args) {LocalVariablesTest test new LocalVariablesTest();int num 10;test.test1();
}如上所示方法我们对其字节码采用命令javap -v LocalVariablesTest.class进行解析后如下所示 使用jclasslib插件查看如下所示 这里做一下补充说明
Start或Start PC起始PC是字节码指令中的行号长度/Length表示字节码指令的长度上图是16Start PC与Length合在一起表示变量的作用域Slot表示变量存储在哪个槽位
① 关于Slot的理解
参数值的存放总是在局部变量数组的index0开始到数组长度-1的索引结束。
局部变量表最基本的存储单元是Slot变量槽。
局部变量表中存放编译期可知的各种基本数据类型8种引用类型referencereturnAddress类型的变量。
在局部变量表里32位以内的类型只占用一个slot包括returnAddress类型64位的类型long和double占用两个slot。
byte、short、char 在存储前被转换为intboolean也被转换为int0表示false非0表示true。long和double则占据两个slot。
JVM会为局部变量表中的每一个Slot都分配一个访问索引通过这个索引即可成功访问到局部变量表中指定的局部变量值。
当一个实例方法被调用的时候它的方法参数和方法体内部定义的局部变量将会按照顺序被复制到局部变量表中的每一个slot上
如果需要访问局部变量表中一个64bit的局部变量值时只需要使用前一个索引即可。比如访问long或double类型变量
如果当前帧是由构造方法或者实例方法创建的那么该对象引用this将会存放在index为0的slot处其余的参数按照参数表顺序继续排列。
- 上一篇: 资源库网站开发阿图什网站
- 下一篇: 资源网站建设多少钱成都定制小程序开发公司
相关文章
-
资源库网站开发阿图什网站
资源库网站开发阿图什网站
- 技术栈
- 2026年04月20日
-
资源共享网站怎么做网站建设属于哪个行业
资源共享网站怎么做网站建设属于哪个行业
- 技术栈
- 2026年04月20日
-
资阳市网站建设wordpress图集主题
资阳市网站建设wordpress图集主题
- 技术栈
- 2026年04月20日
-
资源网站建设多少钱成都定制小程序开发公司
资源网站建设多少钱成都定制小程序开发公司
- 技术栈
- 2026年04月20日
-
资源优化排名网站山东滕州做网站技术电话
资源优化排名网站山东滕州做网站技术电话
- 技术栈
- 2026年04月20日
-
资源优化排名网站响应式模板
资源优化排名网站响应式模板
- 技术栈
- 2026年04月20日
