千家信息网

JVM中的Stack和Frame怎么用

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要讲解了"JVM中的Stack和Frame怎么用",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"JVM中的Stack和Frame怎么用"吧!J
千家信息网最后更新 2026年10月31日JVM中的Stack和Frame怎么用

这篇文章主要讲解了"JVM中的Stack和Frame怎么用",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"JVM中的Stack和Frame怎么用"吧!

JVM执行Java程序时需要装载各种数据,比如类型信息(Class)、类型实例(Instance)、常量数据(Constant)、本地变量等。不同的数据存放在不同的内存区中,这些数据内存区称作"运行时数据区(Runtime Data Area)"。运行时数据区有这样几个重要区:JVM Stack(简称Stack或者虚拟机栈、线程栈、栈等),Frame(又称StackFrame/栈帧、方法栈等),Heap(堆/GC堆,即垃圾收集的对象所在区)。下面简单介绍一下Stack和Frame,对于Heap,请参考垃圾收集相关文章。

概览

单个线程内共享的区:PC Register/JVM Stack/Native Method Stack。
所有线程共享的区:Heap/Method Area/Runtime Constant Pool。

上图:运行时数据区。重点是每个线程拥有的PCRegister/Stack以及线程共享的Heap以及常量池(ConstantPool)

上图:线程栈(VM Statck/Stack)包含的栈帧(Frame)。重点是栈帧和它的结构,操作栈(OperandStack)以及常量池引用。

Stack

结构:{JVM Stack [Frame][Frame][Frame]... }。
JVM Stack在每个线程被创建时被创建,用来存放一组栈帧(StackFrame/Frame)。
JVM Statck的大小可以是固定的,也可以是动态扩展的。如果线程需要一个比固定大小大的Stack,会发生StackOverflowError;如果动态扩展Stack时没有足够的内存或者系统没有足够的内存为新线程创建Stack,发生OutOfMemoryError。

Frame

结构:{Frame [ReturnValue] [LocalVariables[][][][]...] [OperandStack [][][]...] [ConstPoolRef] }
每次方法调用均会创建一个对应的Frame,方法执行完毕或者异常终止,Frame被销毁。一个方法A调用另一个方法B时,A的frame停止,新的frame被创建赋予B,执行完毕后,把计算结果传递给A,A继续执行。

局部变量表
局部变量表的大小在编译期就被确定。基元类型数据以及引用和返回地址(returnAddress)占用一个局部变量大小,long/double需要两个。

Java代码"int a=0;int b=1;int c=2;"对应的局部变量表如下:

LocalVariableTable:Start Length Slot Name Signature2 12 0 a I4 10 1 b I6 8 2 c I

Start: 变量偏移量。
Length: 作用域范围长度。[Start,Start+Length)就是该变量的作用域。
Slot: 一个Slot能存储32bit的数据类型、引用、返回地址,long/dobule需要两个Slot。


操作栈(OperandStack)
Frame被创建时,操作栈是空的。操作栈的每个项可以存放JVM的各种类型数据,包括long/double。
操作栈有个栈深,long/double贡献两个栈深。
操作栈调用其它有返回结果的方法时,会把结果push到栈上。

Java代码:

int a=1;int b=2;int c=a+b;

对应的指令:

0: iconst_1 // push 1到操作栈。大于5的int值会用到 bipush  指令。1: istore_0 // pop 顶元素,存储到index=0的本地变量。2: iconst_2 // push 2 到操作栈3: istore_1 // pop栈顶元素,存储到index=1的本地变量。4: iload_0  // 把index=0的本地变量加载到栈顶5: iload_1  // 把index=1的本地变量加载到栈顶6: iadd     // 把栈顶两个数pop出来相加,并把结果存放到栈顶7: istore_2 // 结果存储到index=2的本地变量

感谢各位的阅读,以上就是"JVM中的Stack和Frame怎么用"的内容了,经过本文的学习后,相信大家对JVM中的Stack和Frame怎么用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

变量 数据 线程 方法 类型 结果 两个 内存 大小 局部 存储 常量 结构 学习 运行 不同 上图 代码 作用 元素 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 喔噻互联网科技有限公司 华服互联网科技靠谱吗 互联网科技产业 互联网科技工作委员会副主任毛军 科技互联网产品 互联网科技有限公司图片 互联网公司 科技公司 科技与互联网发展 互联网的科技创新 广州慧亚互联网科技怎么样 昊天互联网科技有限公司 搜狐科技互联网 青海科技产业互联网发展 互联网公司黑科技创始人 互联网科技数字货币 陕西云淼互联网科技公司 上海同邻互联网科技有限公司规模 抖集互联网科技技术咨询 玉溪新华互联网科技怎么选 银川新华互联网科技学校招聘 互联网高科技企业 互联网科技视频素材 居家互联网科技有限公司 济南华为互联网科技产业总部基地 银川新华互联网科技职业技术培训学校图片 青岛科技大学互联网大赛研究生 和信科技工业互联网 杭州壁岐互联网科技有限公司 恒生互联网科技指数跳水 平安好医生打造互联网科技医疗
0