JVM之Java栈Java stack
JVM之Java棧Java stack
目錄:
1. JVM體系結構概覽
2. JVM之Java棧解析
stack圖
先簡單認識,圖示在一個棧中有兩個棧幀:
解析:
(1)Stack 棧是什么
(2)棧存儲什么?
棧幀中主要保存3 類數據:
(3) 棧運行原理:
棧中的數據都是以棧幀(Stack Frame)的格式存在,棧幀是一個內存區塊,是一個數據集,是一個有關方法(Method)和運行期數據的數據集,當一個方法A被調用時就產生了一個棧幀 F1,并被壓入到棧中,
A方法又調用了 B方法,于是產生棧幀 F2 也被壓入棧,
B方法又調用了 C方法,于是產生棧幀 F3 也被壓入棧,
……
執行完畢后,先彈出F3棧幀,再彈出F2棧幀,再彈出F1棧幀……
遵循“先進后出”/“后進先出”原則。
每個方法執行的同時都會創建一個棧幀,用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息,每一個方法從調用直至執行完畢的過程,就對應著一個棧幀在虛擬機中入棧到出棧的過程。棧的大小和具體JVM的實現有關,通常在256K~756K之間。
(4) 棧+堆+方法區的交互關系
- HotSpot是使用指針的方式來訪問對象:
Java堆中會存放訪問類元數據的地址,
reference存儲的就直接是對象的地址
補充引用: Java棧,PC寄存器,本地方法棧,堆,方法區和運行常量池
Java棧
Java棧的區域很小,只有1M,特點是存取速度很快,所以在stack中存放的都是快速執行的任務,基本數據類型的數據,和對象的引用(reference)。
駐留于常規RAM(隨機訪問存儲器)區域。但可通過它的“棧指針”獲取處理的直接支持。棧指針若向下移,會創建新的內存;若向上移,則會釋放那些內存。這是一種特別快、特別有效的數據保存方式,僅次于寄存器。創建程序時,Java編譯器必須準確地知道堆棧內保存的所有數據的“長度”以及“存在時間”。這是由于它必須生成相應的代碼,以便向上和向下移動指針。這一限制無疑影響了程序的靈活性,所以盡管有些Java數據要保存在棧里——特別是對象句柄,但Java對象并不放到其中。
JVM只會直接對JavaStack(Java棧)執行兩種操作:①以幀為單位的壓棧或出棧;②通過-Xss來設置, 若不夠會拋出StackOverflowError異常。
每個線程包含一個棧區,棧中只保存基本數據類型的數據和自定義對象的引用(不是對象),對象都存放在堆區中
每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。
棧分為3個部分:基本數據類型的變量區、執行環境上下文、操作指令區(存放操作指令)。
棧是存放線程調用方法時存儲局部變量表,操作,方法出口等與方法執行相關的信息,Java棧所占內存的大小由Xss來調節,方法調用層次太多會撐爆這個區域。
總結
以上是生活随笔為你收集整理的JVM之Java栈Java stack的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM之方法区Mothed Area
- 下一篇: Java多线程之volatile详解