java棧的最大深度?


1. 概述

某公司面試,總監大叔過來,問了圖論及棧的最大深度,然后^_^

一直記着,今天搞一下

 

2. 代碼

 1 package com.goodfan.test;
 2 
 3 public class JavaStackTest {
 4     
 5     private int count = 0;
 6     
 7     public void testStack(){
 8         count++;
 9         testStack();
10     };
11     
12     public void test(){
13         try {
14             testStack();
15         } catch (Throwable e) {
16             System.out.println(e);
17             System.out.println("stack height:"+count);
18         }
19     }
20 
21     public static void main(String[] args) {
22         new JavaStackTest().test();
23     }
24 
25 }

 

控制台輸出

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

 

 

轉自:

https://www.cnblogs.com/rocky-fang/p/8367018.html


免責聲明!

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



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