- 局部變量表
- Slot重用與GC
- 操作數(shù)棧
- 局部變量表與操作數(shù)棧加法案例
局部變量表
- 大小固定,局部變量表是一組變量值存儲(chǔ)空間,用于存放方法參數(shù)和方法內(nèi)部定義的局部變量。在Java程序被編譯成Class文件時(shí),就在方法的Code屬性的max_locals數(shù)據(jù)項(xiàng)中確定了該方法所需要分配的最大局部變量表的容量。
- 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ā)操作?
- 引用類(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ù)。
- Slot是可以重用的,當(dāng)Slot中的變量超出了作用域,那么下一次分配Slot的時(shí)候,將會(huì)覆蓋原來(lái)的數(shù)據(jù)。Slot對(duì)對(duì)象的引用會(huì)影響GC(要是被引用,將不會(huì)被回收)。
- 方法返回地址,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ù)棧
- 存儲(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)使用。
- 數(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。
- 運(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é)果到局部變量表中