【JVM】1.1、局部變量表與操作數(shù)棧

  • 局部變量表
    • Slot重用與GC
  • 操作數(shù)棧
  • 局部變量表與操作數(shù)棧加法案例

局部變量表

  1. 大小固定,局部變量表是一組變量值存儲(chǔ)空間,用于存放方法參數(shù)和方法內(nèi)部定義的局部變量。在Java程序被編譯成Class文件時(shí),就在方法的Code屬性的max_locals數(shù)據(jù)項(xiàng)中確定了該方法所需要分配的最大局部變量表的容量。
  2. Slot單位,局部變量表的容量以變量槽(Slot)為最小單位,32位虛擬機(jī)中一個(gè)Slot可以存放一個(gè)32位以?xún)?nèi)的數(shù)據(jù)類(lèi)型(boolean、byte、char、short、int、float、reference和returnAddress八種)所以那些比較小的類(lèi)型也占用32位內(nèi)存(如boolean、byte、char、short),而double和long為64位數(shù)據(jù)類(lèi)型,他們需要兩個(gè)連續(xù)的Slot存儲(chǔ)(64位虛擬機(jī)中可能只需要一個(gè)),但如何保證其并發(fā)操作?
  3. 引用類(lèi)型,reference類(lèi)型(引用類(lèi)型)虛擬機(jī)規(guī)范沒(méi)有明確說(shuō)明它的長(zhǎng)度,但一般來(lái)說(shuō),虛擬機(jī)實(shí)現(xiàn)至少都應(yīng)當(dāng)能從此引用中直接或者間接地查找到對(duì)象在Java堆中的起始地址索引和方法區(qū)中的對(duì)象類(lèi)型數(shù)據(jù)。
  4. Slot是可以重用的,當(dāng)Slot中的變量超出了作用域,那么下一次分配Slot的時(shí)候,將會(huì)覆蓋原來(lái)的數(shù)據(jù)。Slot對(duì)對(duì)象的引用會(huì)影響GC(要是被引用,將不會(huì)被回收)。
  5. 方法返回地址,returnAddress類(lèi)型是為字節(jié)碼指令jsr、jsr_w和ret服務(wù)的,它指向了一條字節(jié)碼指令的地址。

Slot重用與GC

public static void main(String[] args) {
    {
        byte[] placeholder = new byte[1024 * 1024 * 64];
    }
    System.gc();
}

[GC (System.gc())  70779K->66200K(251392K), 0.0008518 secs]
[Full GC (System.gc())  66200K->66059K(251392K), 0.0055584 secs]

byte數(shù)組結(jié)束之后執(zhí)行g(shù)c,因?yàn)镾lot還被byte數(shù)組引用,結(jié)果在內(nèi)存中未被回收。

public static void main(String[] args) {
    {
        byte[] placeholder = new byte[1024 * 1024 * 64];
    }
    int i = 0;
    System.gc();
}
[GC (System.gc())  70779K->66296K(251392K), 0.0009577 secs]
[Full GC (System.gc())  66296K->523K(251392K), 0.0051850 secs]

在gc上增加int復(fù)制操作,因?yàn)镾lot的被int值復(fù)用,這次成功回收了byte數(shù)組。在gc上賦值byte數(shù)組為null也可以達(dá)到這樣的效果,并且看起比int賦值來(lái)的更規(guī)范。 在實(shí)際編碼中,因?yàn)閖ava的特性,不做特殊處理,方法結(jié)束后局部變量表也會(huì)釋放。


操作數(shù)棧

  1. 存儲(chǔ)運(yùn)算方式,和局部變量區(qū)一樣,操作數(shù)棧也是被組織成一個(gè)以字長(zhǎng)為單位的數(shù)組。但是和前者不同的是,它不是通過(guò)索引來(lái)訪問(wèn),而是通過(guò)標(biāo)準(zhǔn)的棧操作—壓棧和出?!獊?lái)訪問(wèn)的。比如,如果某個(gè)指令把一個(gè)值壓入到操作數(shù)棧中,稍后另一個(gè)指令就可以彈出這個(gè)值來(lái)使用。
  2. 數(shù)據(jù)類(lèi)型存儲(chǔ),虛擬機(jī)在操作數(shù)棧中存儲(chǔ)數(shù)據(jù)的方式和在局部變量區(qū)中是一樣的:如int、long、float、double、reference和returnType的存儲(chǔ)。對(duì)于byte、short以及char類(lèi)型的值在壓入到操作數(shù)棧之前,也會(huì)被轉(zhuǎn)換為int。
  3. 運(yùn)算方式,虛擬機(jī)把操作數(shù)棧作為它的工作區(qū)——大多數(shù)指令都要從這里彈出數(shù)據(jù),執(zhí)行運(yùn)算,然后把結(jié)果壓回操作數(shù)棧。

局部變量表與操作數(shù)棧加法案例

局部變量表與操作數(shù)棧加法案例
before starting // 加載100和98到局部變量表中
after iload_0   // 加載100到操作數(shù)棧中
after iload_1   // 加載98到操作數(shù)棧中
after iadd      // 操作100+98命令
after istore_2  // 彈出結(jié)果到局部變量表中
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容