對於一個運行中的Java程序而言,它還可能會用到一些跟本地方法相關的數據區。當某個線程調用一個本地方法時,它就進入了一個全新的而且再也不受虛擬機限制的世界。本地方法能夠經過本地方法接口來訪問虛擬機的運行時數據區,但不止如此,它還能夠作任何它想作的事情。html
本地方法本質上時依賴於實現的,虛擬機實現的設計者們能夠自由地決定使用怎樣的機制來讓Java程序調用本地方法。函數
任何本地方法接口都會使用某種本地方法棧。當線程調用Java方法時,虛擬機會建立一個新的棧幀並壓入Java棧。然而當它調用的是本地方法時,虛擬機會保持Java棧不變,再也不在線程的Java棧中壓入新的幀,虛擬機只是簡單地動態鏈接並直接調用指定的本地方法。post
若是某個虛擬機實現的本地方法接口是使用C鏈接模型的話,那麼它的本地方法棧就是C棧。當C程序調用一個C函數時,其棧操做都是肯定的。傳遞給該函數的參數以某個肯定的順序壓入棧,它的返回值也以肯定的方式傳回調用者。一樣,這就是虛擬機實現中本地方法棧的行爲。spa
極可能本地方法接口須要回調Java虛擬機中的Java方法,在這種狀況下,該線程會保存本地方法棧的狀態並進入到另外一個Java棧。線程
下圖描繪了這樣一個情景,就是當一個線程調用一個本地方法時,本地方法又回調虛擬機中的另外一個Java方法。設計
這幅圖展現了JAVA虛擬機內部線程運行的全景圖。一個線程可能在整個生命週期中都執行Java方法,操做它的Java棧;或者它可能毫無障礙地在Java棧和本地方法棧之間跳轉。 htm
該線程首先調用了兩個Java方法,而第二個Java方法又調用了一個本地方法,這樣致使虛擬機使用了一個本地方法棧。假設這是一個C語言棧,其間有兩個C函數,第一個C函數被第二個Java方法當作本地方法調用,而這個C函數又調用了第二個C函數。以後第二個C函數又經過本地方法接口回調了一個Java方法(第三個Java方法),最終這個Java方法又調用了一個Java方法(它成爲圖中的當前方法)。blog