ad

《深入理解 Java 虚拟机 JVM 高级特性与最佳实践(第3版)》_求知之路漫漫_2.2.2 Java虚拟机栈

网友投稿 119 2023-11-07

【摘要】 本书摘自《深入理解 Java 虚拟机 JVM 高级特性与最佳实践(第3版)》一书中第2章,第2节,周志明著。

2.2.2 Java虚拟机栈

与程序计数器 一样,Java 虚拟机栈 (Java Virtual Machine Stack) 也是线程私有的,它 的生命周期与线程相同。虚拟机栈描述的是Java 方法执行的线程内存模型:每个方法被执 行 的 时 候 ,Java 虚拟机都会同步创建一个栈帧③ (Stack Frame) 用于存储局部变量表、操作 数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一 个栈帧在虚拟机栈中从入栈到出栈的过程。

经常有人把Java 内存区域笼统地划分为堆内存 (Heap) 和栈内存 (Stack), 这种划分方 式直接继承自传统的C 、C++ 程序的内存布局结构,在 Java 语言里就显得有些粗糙了,实 际的内存区域划分要比这更复杂。不过这种划分方式的流行也间接说明了程序员最关注的、与对象内存分配关系最密切的区域是“堆”和“栈”两块。其中,“堆”在稍后笔者会专门 讲述,而“栈”通常就是指这里讲的虚拟机栈,或者更多的情况下只是指虚拟机栈中局部 变量表部分。

局部变量表存放了编译期可知的各种Java 虚拟机基本数据类型 (boolean 、byte 、char 、 short 、int 、float 、long 、double) 、 对象引用 (reference 类型,它并不等同于对象本身,可 能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他与此 对象相关的位置)和 returnAddress 类型(指向了一条字节码指令的地址)。

《深入理解 Java 虚拟机 JVM 高级特性与最佳实践(第3版)》_求知之路漫漫_2.2.2 Java虚拟机栈

这些数据类型在局部变量表中的存储空间以局部变量槽 (Slot) 来表示,其中64位长度 的 long 和 double类型的数据会占用两个变量槽,其余的数据类型只占用一个。局部变量表 所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多 大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。请读者注 意,这里说的“大小”是指变量槽的数量,虚拟机真正使用多大的内存空间(譬如按照1个 变量槽占用32个比特、64个比特,或者更多)来实现一个变量槽,这是完全由具体的虚拟 机实现自行决定的事情。

在《 Java 虚拟机规范》中,对这个内存区域规定了两类异常状况:如果线程请求的栈 深度大于虚拟机所允许的深度,将抛出StackOverflowError 异常;如果Java 虚拟机栈容量 可以动态扩展9,当栈扩展时无法申请到足够的内存会抛出 OutOfMemoryError 异常。

2.2.3 本地方法栈

本地方法栈 (Native Method Stacks) 与虚拟机栈所发挥的作用是非常相似的,其区别只 是虚拟机栈为虚拟机执行Java 方法(也就是字节码)服务,而本地方法栈则是为虚拟机使 用到的本地 (Native) 方法服务。

《Java 虚拟机规范》对本地方法栈中方法使用的语言、使用方式与数据结构并没有任何 强制规定,因此具体的虚拟机可以根据需要自由实现它,甚至有的Java 虚拟机(譬如 Hot- Spot 虚拟机)直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈也会 在栈深度溢出或者栈扩展失败时分别抛出 StackOverflowError 和 OutOfMemoryError 异常。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《Python+3自动化软件发布系统》Django 2实战_了解Python的更好方法_2.6 Django 路由 URL
下一篇:《Excel VBA+SQL数据管理与应用模板开发》_工作效率UP!_6.2 控件基本知识
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×