虚拟机栈和栈帧的起源和关系

背景

看《深入理解 Java 虚拟机》这本书时,讲到 Java 虚拟机栈和栈帧的部分,不清楚为何要创造这个概念,这个内存模型存在的目的是什么,来源是什么,书中都没有扩展开来说清楚,而了解一个概念的起源对理解这个概念是很有帮助。

网上查了几篇文章都没说到这个知识背景,关于虚拟机栈和栈帧的起源,可以看这个YouTube视频:Procedures, Video 3: Stack-based languages

该视频属于大名鼎鼎的 Hardware/Software Interface class 中的一小节,讲得相当清晰。

本文是结合该视频做的笔记结合自己的理解,加深印象。

Stack-Based Languages

目的:To make it possible to support recursion in most of the programming languages, you have to keep track of all of the recursive functions that being called. 为了实现递归调用一个方法自身,我们需要有存储每次递归调用的方法状态等,包含:

Argument;Local Variable;Return Pointer。

Stack Frame

Stack allocated in frames, which is called Stack Frame.

扫描二维码关注公众号,回复: 6594419 查看本文章

When we call a function, we create a new frame for it, by addressing the stack pointer to create a space (memory) for all these states.

State: Local Variables;Function arguments; Return infomation; Temporary space.

Stack-based Language 描述了一种栈语言的概念,不管是c 还是 java 的方法都用到了栈语言。

虚拟机栈是针对线程而言,线程里的方法对应栈中的元素--栈帧。

入栈出栈流程分析

每执行一个方法,就为这个方法创建对应的栈帧,并 push 到线程这个大容器--Java 虚拟机栈中,执行完就 pop 出栈。

方法链对应的栈帧集合

对于有多个子方法的方法来说,相当于一个方法调用链,首先父方法开始执行,入栈,被压到底部,接着执行子方法,入栈,压到父方法顶部。如果该子方法还有自己的子方法,则同理,再将子子方法压到子方法的顶部。直到调用到方法链尾部,再挨个从最深的子方法出栈,接着再到上一层方法的出栈,直到最后父方法执行到返回语句,该方法链对应的一连串栈帧都出栈完毕。

例子

转载于:https://juejin.im/post/5cfddb6b6fb9a07ee85c1e42

猜你喜欢

转载自blog.csdn.net/weixin_34327761/article/details/93174426
今日推荐