温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

JVM中的Stack和Frame怎么用

发布时间:2022-01-05 17:14:48 来源:亿速云 阅读:110 作者:iii 栏目:云计算

这篇文章主要讲解了“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。

JVM中的Stack和Frame怎么用

上图:运行时数据区。重点是每个线程拥有的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 Signature
2 12 0 a I
4 10 1 b I
6 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 <i> 指令。
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怎么用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI