1. 概述
某公司面試,總監大叔過來,問了圖論及棧的最大深度,然后^_^
一直記着,今天搞一下
2. 代碼
package com.goodfan.test; public class JavaStackTest { private int count = 0; public void testStack(){ count++; testStack(); }; public void test(){ try { testStack(); } catch (Throwable e) { System.out.println(e); System.out.println("stack height:"+count); } } public static void main(String[] args) { new JavaStackTest().test(); } }
控制台輸出
java.lang.StackOverflowError
stack height:11421
3. 總結
3.1 java棧是java虛擬機的一個重要的組成部分,在棧里進行線程操作,存放方法參數等等。
棧在初始化過后是有一定的大小的。
棧的高度稱為棧的深度,棧深度受棧幀大小影響。
我們知道,在棧中存放局部變量,參數,運行中間結果等。
3.2 增加參數(因為方法參數需要占用內存 所以棧可為方法本身占用的地方就減少了)
public void testStack(int a, int b){ count++; testStack(a,b); }
控制台輸出
java.lang.StackOverflowError
stack height:9654
3.3 進一步,
3.3.1 增加局部變量 數量
public void testStack(int a, int b){ int c =5; long d=4L; count++; testStack(a,b); }
控制台輸出
java.lang.StackOverflowError
stack height:7854
3.3.2 增大變量值
public void testStack(int a, int b){ int c =5; long d=47777777777777777L; count++; testStack(a,b); }
控制台輸出
java.lang.StackOverflowError
stack height:7846
由此可以看出,局部變量表內容越多,棧幀越大,棧深度越小。
知道了棧深度,該怎么用呢?對JVM調優有什么用呢?
當我們定義的方法參數和局部變量過多,字節過大,考慮到可能會導致棧深度多小,可能使程序出現錯誤。
這個時候就需要手動的增加棧的深度,避免出錯。
3.4 調整jvm 棧大小
C:\Users\rocky fang\Documents\mycode>java -Xss2m -cp "C:\Users\rocky fang\Documents\mycode" JavaStackTest
java.lang.StackOverflowError
stack height:23345
C:\Users\rocky fang\Documents\mycode>java -Xss5m -cp "C:\Users\rocky fang\Documents\mycode" JavaStackTest
java.lang.StackOverflowError
stack height:93213
C:\Users\rocky fang\Documents\mycode>java -Xss10m -cp "C:\Users\rocky fang\Documents\mycode" JavaStackTest
java.lang.StackOverflowError
stack height:423618