某公司面试,总监大叔过来,问了图论及栈的最大深度,然后^_^
一直记着,今天搞一下
package com.jvm.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
栈在初始化过后是有一定的大小的。
栈的高度称为栈的深度,栈深度受栈帧大小影响。
我们知道,在栈中存放局部变量,参数,运行中间结果等。
(因为方法参数需要占用内存 所以栈可为方法本身占用的地方就减少了)
public void testStack(int a, int b){
count++;
testStack(a,b);
}
控制台输出
java.lang.StackOverflowError
stack height:9654
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调优有什么用呢?
当我们定义的方法参数和局部变量过多,字节过大,考虑到可能会导致栈深度多小,可能使程序出现错误。
这个时候就需要手动的增加栈的深度,避免出错。
C:\Users\bianmaqianxian\Documents\mycode>java -Xss2m -cp "C:\Usersbianmaqianxian\Documents\mycode" JavaStackTest
java.lang.StackOverflowError
stack height:23345
C:\Users\bianmaqianxian\Documents\mycode>java -Xss5m -cp "C:\Users\bianmaqianxian\Documents\mycode" JavaStackTest
java.lang.StackOverflowError
stack height:93213
C:\Users\bianmaqianxian\Documents\mycode>java -Xss10m -cp "C:\Users\bianmaqianxian\Documents\mycode" JavaStackTest
java.lang.StackOverflowError
stack height:423618