java 棧 最大深度


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM