• 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 ocky fangDocumentsmycode>java -Xss2m -cp "C:Users ocky fangDocumentsmycode" JavaStackTest
    java.lang.StackOverflowError
    stack height:23345

    C:Users ocky fangDocumentsmycode>java -Xss5m -cp "C:Users ocky fangDocumentsmycode" JavaStackTest
    java.lang.StackOverflowError
    stack height:93213

    C:Users ocky fangDocumentsmycode>java -Xss10m -cp "C:Users ocky fangDocumentsmycode" JavaStackTest
    java.lang.StackOverflowError
    stack height:423618

    转自:

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

  • 相关阅读:
    Android开发环境配置
    还原数据库的时候显示“因为数据库正在使用,所以无法获得对数据库的独占访问权”
    Sql中当插入的字符多于8000个字符只能插入一部分,数据丢失的处理
    XML序列化的注意事项
    Js中的this和window.event.srcElement
    JS中的加密解密操作,以及对应的C#中的加密解密
    添加WebService
    CSRF(跨站点请求伪造)
    css中table-layout:fixed 属性的解说
    vs2012发布网站到IIS遇到的问题
  • 原文地址:https://www.cnblogs.com/zt007/p/10431401.html
Copyright © 2020-2023  润新知