Java中方法的局部變量是放在虛擬機(jī)棧的局部變量表里面,形參也算一個(gè)。
本地變量表搂橙,就是局部變量表,只是翻譯不同浙炼。
棧幀以變量槽為最小單位份氧。
快速認(rèn)識(shí)
代碼說明
public static void main(String[] args) {
byte[] waste = new byte[6 * 1024 * 1024];
int new_var = 0;
System.gc();
}
反編譯得到:
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=3, args_size=1
0: ldc #2 // int 6291456
2: newarray byte
4: astore_1
5: iconst_0
6: istore_2
7: invokestatic #3 // Method java/lang/System.gc:()V
10: return
變量槽 Slot
局部變量表的容量以變量槽(Variable Slot)為最小單位,虛擬機(jī)中并沒有明確指明一個(gè)Slot應(yīng)占用的內(nèi)存空間大小弯屈,只是很有導(dǎo)向性的說到每個(gè)Slot都應(yīng)該能存放一個(gè)下面8種類型的其中一個(gè)蜗帜。
- boolean
- byte
- char
- short
- int
- float
- reference
- returnAddress
不使用的對(duì)象,應(yīng)當(dāng)手動(dòng)賦值為null
為了盡可能節(jié)省椬世鳎空間厅缺,局部變量表的Slot可以復(fù)用。
方法體中定義的變量,其作用域并不一定覆蓋整個(gè)方法體湘捎,如果當(dāng)前字節(jié)碼PC計(jì)數(shù)器的值已經(jīng)超出了某個(gè)變量的作用域诀豁,那這個(gè)變量對(duì)應(yīng)的Slot就可以交給其他變量使用。