每當啟動(dòng)一個(gè)新線(xiàn)程的時(shí)候,java虛擬機都會(huì )為它分配一個(gè)java棧。java以棧幀為單位保存線(xiàn)程的運行狀態(tài)。虛擬機只會(huì )對java棧執行兩種操作:以棧幀為單位的壓?;蛘叱鰲?。
java方法可以通過(guò)兩種方式完成,一種通過(guò)return返回,成為正常返回;一種通過(guò)拋出異常而異常終止 。虛擬機都會(huì )將當前棧彈出java棧然后釋放掉,這樣上一個(gè)方法的棧幀就是當前棧幀了。
java棧上是此對應的java線(xiàn)程所私有的。因此不存在多線(xiàn)程情況下棧數據訪(fǎng)問(wèn)同步的問(wèn)題。
棧幀由三部分組成:局部變量區,操作數棧和幀數據區。 局部變量區和操作數棧要視對應的方法而定,它們是按照字長(cháng)計算的。
局部變量區: java棧幀的局部變量區被組織為一個(gè)以字長(cháng)為單位,從0開(kāi)始計數的數組。字節碼指令通過(guò)從0開(kāi)始的索引來(lái)使用其中的數據。類(lèi)型為int,float,reference和returnaddress的值在數組中只占一項,而類(lèi)型為byte,short和char的值在存入數組前都將被轉換為int。但是long和double類(lèi)型在數組中卻占據連續的兩項。
操作數棧和局部變量區一樣。也被組織成一個(gè)以字長(cháng)為單位的數組。但是不是通過(guò)索引來(lái)訪(fǎng)問(wèn),而是通過(guò)標準棧操作--壓棧和出棧來(lái)訪(fǎng)問(wèn)。
不同于程序計數器,java虛擬機沒(méi)有寄存器,程序計數器也無(wú)法被程序指令直接訪(fǎng)問(wèn)。java虛擬機是由操作數棧而不是從寄存器中取得操作數的,因此它的運行方式是基于棧的而不是基于寄存器的。
虛擬機把操作數棧作為它的工作區--大多數指令都要從這里彈出數據,執行運算,然后把結果壓回操作數棧。
聯(lián)系客服