jclasslib是一個獨立的工具,不是包含在JDK中的工具,須要本身進行下載,下載地址以下:java
http://downfile.downcc.com/down/JClassLib_windows.zipwindows
在《Java中的棧》中咱們說到了一個棧幀至少須要包含局部變量表、操做數棧、幀數據區這三個部分。局部變量表是用於保存函數的參數以及局部變量的。顧名思義,局部變量表中的變量只在當前的函數的用中有效,當函數調用結束後,隨着函數棧幀的銷燬,局部變量表也會隨之被銷燬。函數
因爲局部變量表在棧幀之中,所以,若是函數的參數和局部變量不少,會使得局部變量表膨脹,所以,每一次函數調用,其局部變量表就會佔用更多的棧空間,最終致使函數的嵌套調用的次數減小。工具
public class TestStackDeepth { private static int length=0; public static void recursion(long a,long b,long c) { long e=1,f=2,g=3,h=4,i=5,k=6,q=7,x=8,y=9,z=11; length++; recursion(a, b, c); } public static void main(String[] args) { try { recursion(1l,2l,3l); } catch (Throwable ex) { System.out.println(length); } } }
打開jclasslib,選擇對應的3中.class文件性能
加載好的jclasslib界面以下圖所示優化
在jclasslib中能夠看到recursion函數的最大局部變量是26個字。由於該函數一共13個參數和局部spa
變量,並且都是long類型。.net
查看class文件的局部變量表的內容(下圖中的局部變量表是指class文件的一個屬性,而不是上文中所說的設計
java棧中的每一個棧幀的局部變量表)code
從上面能夠看到,在class文件的局部變量表中,顯示了每一個變量的做用域範圍,所在槽位的索引(index列)、變量名(name列)和數據類型列(J表示long型)。
棧中的局部變量表的槽位是能夠重複利用的,若是一個局部變量過了其做用域,那麼在其做用域以後申明的新的局部變量頗有可能會複用過時局部變量的槽位,從而達到節省資源的目的。
public class IndexReuse { public static void method1() { int a=0; System.out.println(a); int b=0; } public static void method2() { { int a=0; System.out.println(a); } int b=0; } public static void main(String[] args) { } }
method1中的局部變量表,因爲a和b的做用範圍都是整個函數,因此,b不用複用a的槽位
method2中的局部變量表,因爲a只在{}中起做用,因此b在a以後,能夠複用a的槽位,所以a和b的槽位都是0
從上面的例子咱們能夠體會到局部變量的聲明位置會影響垃圾回收器對變量所佔內存空間的回收,所以,在之後的程序設計中,咱們應該儘量的進行優化,從而提升性能。