1. 程式人生 > >java 棧 最大深度

java 棧 最大深度

height 當我 結果 net 線程 一定的 style 操作 pack

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

java 棧 最大深度