×

java棧

  • 作者:新網(wǎng)
  • 來源:新網(wǎng)
  • 瀏覽:100
  • 2018-05-07 11:25:35

每當(dāng)啟動(dòng)一個(gè)新線程的時(shí)候,java虛擬機(jī)都會(huì)為它分配一個(gè)java棧。java以棧幀為單位保存線程的運(yùn)行狀態(tài)。虛擬機(jī)只會(huì)對(duì)java棧執(zhí)行兩種操作:以棧幀為單位的壓?;蛘叱鰲?。

   每當(dāng)啟動(dòng)一個(gè)新線程的時(shí)候,java虛擬機(jī)都會(huì)為它分配一個(gè)java棧。java以棧幀為單位保存線程的運(yùn)行狀態(tài)。虛擬機(jī)只會(huì)對(duì)java棧執(zhí)行兩種操作:以棧幀為單位的壓?;蛘叱鰲!?/p>

83871491614422170.jpg

<div>  java方法可以通過兩種方式完成,一種通過return返回,成為正常返回;一種通過拋出異常而異常終止 。虛擬機(jī)都會(huì)將當(dāng)前棧彈出java棧然后釋放掉,這樣上一個(gè)方法的棧幀就是當(dāng)前棧幀了。
  java棧上是此對(duì)應(yīng)的java線程所私有的。因此不存在多線程情況下棧數(shù)據(jù)訪問同步的問題。
  棧幀
  棧幀由三部分組成:局部變量區(qū),操作數(shù)棧和幀數(shù)據(jù)區(qū)。 局部變量區(qū)和操作數(shù)棧要視對(duì)應(yīng)的方法而定,它們是按照字長(zhǎng)計(jì)算的。
  局部變量區(qū): java棧幀的局部變量區(qū)被組織為一個(gè)以字長(zhǎng)為單位,從0開始計(jì)數(shù)的數(shù)組。字節(jié)碼指令通過從0開始的索引來使用其中的數(shù)據(jù)。類型為int,float,reference和returnaddress的值在數(shù)組中只占一項(xiàng),而類型為byte,short和char的值在存入數(shù)組前都將被轉(zhuǎn)換為int。但是long和double類型在數(shù)組中卻占據(jù)連續(xù)的兩項(xiàng)。
  操作數(shù)棧和局部變量區(qū)一樣。也被組織成一個(gè)以字長(zhǎng)為單位的數(shù)組。但是不是通過索引來訪問,而是通過標(biāo)準(zhǔn)棧操作--壓棧和出棧來訪問。
  不同于程序計(jì)數(shù)器,java虛擬機(jī)沒有寄存器,程序計(jì)數(shù)器也無法被程序指令直接訪問。java虛擬機(jī)是由操作數(shù)棧而不是從寄存器中取得操作數(shù)的,因此它的運(yùn)行方式是基于棧的而不是基于寄存器的。
  虛擬機(jī)把操作數(shù)棧作為它的工作區(qū)--大多數(shù)指令都要從這里彈出數(shù)據(jù),執(zhí)行運(yùn)算,然后把結(jié)果壓回操作數(shù)棧。

免責(zé)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),也不承認(rèn)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,請(qǐng)發(fā)送郵件至:operations@xinnet.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

免費(fèi)咨詢獲取折扣

Loading