深刻理解java虛擬機-運行時棧幀結構

棧幀是什麼?java

用於支持虛擬機進行方法調用和方法執行的數據結構.數據結構

棧幀都存儲了些什麼東東?優化

每個棧幀都包括方法的局部變量表,操做棧,動態鏈接和方法返回地址和一些附加信息等.spa

線程,棧幀,方法之間的關係?線程

一個線程包括多個棧幀,在活動的線程中,棧頂的棧幀爲當前棧幀,與該棧幀相關聯的方法爲當前方法.對象

局部變量表是什麼?索引

是一組變量值存儲空間,用於存放方法參數和方法內部定義的局部變量.內存

局部變量表空間是如何分配的?作用域

局部變量表容量以Slot爲最小單位,一個Slot能夠存放一個32位之內的數據類型.在Java程序編譯爲Class文件時,在方法的Code屬性的max_locals數據項中肯定了該方法所須要分配局部變量表的最大容量.虛擬機

Slot存儲的8種數據類型都是哪些?

 boolean,byte,char,short,int,float,reference,returnAddress.

reference類型表示什麼?虛擬機能夠經過reference類型作什麼?

reference表示對一個對象實例的引用.能夠經過reference類型作到兩點

  1. 從引用中直接或間接的查找到對象在java堆中的數據存放的起始地址索引.

  2. 從引用中直接或間接的查找到對象在方法區中存儲的類型信息.

一個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.

操做棧的使用過程和用途?

在方法的執行過程當中,會有各類字節碼指令往操做棧中寫入和提取內容,也就是 出棧/入棧 操做.

一般用作算數運算和調用其餘方法時用來進行參數傳遞.

相關文章
相關標籤/搜索