虛擬機棧和棧幀的起源和關係

背景

看《深刻理解 Java 虛擬機》這本書時,講到 Java 虛擬機棧和棧幀的部分,不清楚爲什麼要創造這個概念,這個內存模型存在的目的是什麼,來源是什麼,書中都沒有擴展開來講清楚,而瞭解一個概念的起源對理解這個概念是頗有幫助。java

網上查了幾篇文章都沒說到這個知識背景,關於虛擬機棧和棧幀的起源,能夠看這個YouTube視頻:Procedures, Video 3: Stack-based languageside

該視頻屬於大名鼎鼎的 Hardware/Software Interface class 中的一小節,講得至關清晰。spa

本文是結合該視頻作的筆記結合本身的理解,加深印象。線程

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. 爲了實現遞歸調用一個方法自身,咱們須要有存儲每次遞歸調用的方法狀態等,包含:cdn

Argument;Local Variable;Return Pointer。視頻

Stack Frame

Stack allocated in frames, which is called Stack Frame.blog

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 的方法都用到了棧語言。get

虛擬機棧是針對線程而言,線程裏的方法對應棧中的元素--棧幀。

入棧出棧流程分析

每執行一個方法,就爲這個方法建立對應的棧幀,並 push 到線程這個大容器--Java 虛擬機棧中,執行完就 pop 出棧。

方法鏈對應的棧幀集合

對於有多個子方法的方法來講,至關於一個方法調用鏈,首先父方法開始執行,入棧,被壓到底部,接着執行子方法,入棧,壓到父方法頂部。若是該子方法還有本身的子方法,則同理,再將子子方法壓到子方法的頂部。直到調用到方法鏈尾部,再挨個從最深的子方法出棧,接着再到上一層方法的出棧,直到最後父方法執行到返回語句,該方法鏈對應的一連串棧幀都出棧完畢。

例子

相關文章
相關標籤/搜索