随笔 - 256  文章 - 2  评论 - 18  阅读 - 123万

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

posted on   腾逸  阅读(1772)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示