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