棧幀是什麼?java
用於支持虛擬機進行方法調用和方法執行的數據結構.數據結構
棧幀都存儲了些什麼東東?優化
每個棧幀都包括方法的局部變量表,操做棧,動態鏈接和方法返回地址和一些附加信息等.spa
線程,棧幀,方法之間的關係?線程
一個線程包括多個棧幀,在活動的線程中,棧頂的棧幀爲當前棧幀,與該棧幀相關聯的方法爲當前方法.對象
局部變量表是什麼?索引
是一組變量值存儲空間,用於存放方法參數和方法內部定義的局部變量.內存
局部變量表空間是如何分配的?作用域
局部變量表容量以Slot爲最小單位,一個Slot能夠存放一個32位之內的數據類型.在Java程序編譯爲Class文件時,在方法的Code屬性的max_locals數據項中肯定了該方法所須要分配局部變量表的最大容量.虛擬機
Slot存儲的8種數據類型都是哪些?
boolean,byte,char,short,int,float,reference,returnAddress.
reference類型表示什麼?虛擬機能夠經過reference類型作什麼?
reference表示對一個對象實例的引用.能夠經過reference類型作到兩點
從引用中直接或間接的查找到對象在java堆中的數據存放的起始地址索引.
從引用中直接或間接的查找到對象在方法區中存儲的類型信息.
一個Slot能夠存放一個32位之內的數據類型,那對於64位的數據類型該如何處理?
虛擬機會以高位對齊的方式爲其分配兩個連續的Slot空間.
局部變量表中的Slot是否可重用?重用有哪些優缺點?
Slot是能夠重用的,若是當前字節碼PC計數器值超出某變量的做用域,那這個變量對應的slot就能夠交給其餘變量使用.
優勢是能夠節省必定的棧幀空間.
缺點是在某些狀況下Slot複用會影響到GC的行爲.如
第一次執行
void x(){
byte[] b=new byte[65535];
System.gc();
}
此時由於變量b還在做用域以內,因此GC並未回收b佔有的內存.
第二次執行
void x(){
byte[] b=new byte[65535];
}
System.gc();
此時的佔有的內存仍然沒有被回收.由於在第一次修改時,代碼雖然已經離開了b的做用域,但此後並無任何對局部變量表的讀寫操做,b所佔有的Slot尚未被其餘變量所複用,因此GC Roots一部分的局部變量仍然保持的對它的關聯.
第三次執行
void x(){
byte[] b=new byte[65535];
b=null;
}
System.gc();
此時GC正常回收b佔有的內存.但通過JIT編譯優化後,b=null的代碼能夠省略,GC能夠正確回收掉內存.
什麼是操做棧?
後入先出結構,最大深度在編譯的時候寫入到Code屬性的max_stacks數據項中.其中的每個元素能夠是任意java數據類型.
32位佔用的棧容量爲1, 64位佔用的爲2.
操做棧的使用過程和用途?
在方法的執行過程當中,會有各類字節碼指令往操做棧中寫入和提取內容,也就是 出棧/入棧 操做.
一般用作算數運算和調用其餘方法時用來進行參數傳遞.