JVM的本地方法棧-通俗理解


1.本地方法棧(Native Method Stacks)與虛擬機棧所發揮的作用是非常相似的,

2.其區別不過是虛擬機棧為虛擬機執行Java方法(也就是字節碼)服務,而本地方法棧則是為虛擬機使用到的Native方法服務。

3.虛擬機規范中對本地方法棧中的方法使用的語言、使用方式與數據結構並沒有強制規定,因此具體的虛擬機可以自由實現它。甚至有的虛擬機(譬如Sun HotSpot虛擬機)直接就把本地方法棧和虛擬機棧合二為一。

4.與虛擬機棧一樣,本地方法棧區域也會拋出StackOverflowError和OutOfMemoryError異常。

  如果某個虛擬機實現的本地方法接口是使用C連接模型的話,那么它的本地方法棧就是C棧。當C程序調用一個C函數時,其棧操作都是確定的。傳遞給該函數的參數以某個確定的順序壓入棧,它的返回值也以確定的方式傳回調用者。同樣,這就是虛擬機實現中本地方法棧的行為。

  很可能本地方法接口需要回調Java虛擬機中的Java方法,在這種情況下,該線程會保存本地方法棧的狀態並進入到另一個Java棧。

  下圖描繪了這樣一個情景,就是當一個線程調用一個本地方法時,本地方法又回調虛擬機中的另一個Java方法。

  這幅圖展示了JAVA虛擬機內部線程運行的全景圖。一個線程可能在整個生命周期中都執行Java方法,操作它的Java棧;或者它可能毫無障礙地在Java棧和本地方法棧之間跳轉。 

該線程首先調用了兩個Java方法,而第二個Java方法又調用了一個本地方法,這樣導致虛擬機使用了一個本地方法棧。假設這是一個C語言棧,其間有兩個C函數,第一個C函數被第二個Java方法當做本地方法調用,而這個C函數又調用了第二個C函數。之后第二個C函數又通過本地方法接口回調了一個Java方法(第三個Java方法),最終這個Java方法又調用了一個Java方法(它成為圖中的當前方法)。

參考:https://www.cnblogs.com/wade-luffy/p/5813747.html

《深入理解Java虛擬機:JVM高級特性與最佳實踐》 作者: 周志明 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM