1. 概述

某公司面试,总监大叔过来,问了图论及栈的最大深度,然后^_^

一直记着,今天搞一下

2. 代码

 package com.goodfan.test;

 public class JavaStackTest {

     private int count = ;

     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

转自:

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

java栈的最大深度?的更多相关文章

  1. java 栈 最大深度

      1. 概述 某公司面试,总监大叔过来,问了图论及栈的最大深度,然后^_^ 一直记着,今天搞一下 2. 代码 package com.goodfan.test; public class JavaS ...

  2. java虚拟机 jvm 出入java栈 栈空间内存分配

    java栈空间是一块线程私有的内存空间,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关.线程最基本的执行行为就是函数的调用.每次函数调用其实是通过java栈传递数据的. 数据结构中 ...

  3. java 栈和栈帧

    文章转载自:http://www.tuicool.com/articles/URZrMnb jvm为每个新创建的线程都分配一个堆栈.堆栈以帧为单位保存线程的状态.jvm对堆栈只进行两种操作:以帧为单位 ...

  4. 从几个sample来学习JAVA堆、方法区、JAVA栈和本地方法栈

    最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程,大部分的程序员在写程序时不会太关注Java运行时数据区域的结构: 感觉有 ...

  5. java栈内存堆内存和GC相关

    java栈内存堆内存 Java把内存分成两种,一种叫做栈内存,一种叫做堆内存,有着不同的作用.栈内存用来存储局部变量和方法调用.栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属 ...

  6. JAVA栈帧

    简介 Java栈是一块线程私有的内存空间.java堆和程序数据相关,java栈就是和线程执行密切相关的,线程的执行的基本行为是函数调用,每次函数调用的数据都是通过java栈来传递的. Java栈与数据 ...

  7. java虚拟机 jvm java堆 方法区 java栈

    java堆是java应用程序最密切的内存空间.几乎所有的对象都存在堆中.java堆完全自动化管理,通过垃圾回收机制,垃圾对象会自动清理,不需要显式释放. 根据java垃圾回收机制的不同,java堆可能 ...

  8. 【多线程】死锁与Java栈跟踪工具

    今天面试有一道题,写一个死锁的程序,自己也是短路了,没写出来,回来写下. 死锁常见的情况是A线程持有a锁.阻塞于b锁,B线程持有b锁,阻塞于a锁,形成一个循环阻塞的状态. import java.ut ...

  9. JVM(1)之 JAVA栈

    开发十年,就只剩下这套架构体系了! >>>   若想使自己编写的Java程序高效运行,以及进行正确.高效的异常诊断,JVM是不得不谈的一个话题.本"JVM进阶"专 ...

随机推荐

  1. NHibernate官方文档——第八章 继承映射(Inheritance Mapping)

    本文翻译自NHibernate官方文档NHibernate Reference Documentation 4.1. 受限于个人知识水平,有些地方翻译可能不准确,但是我还是希望我的这些微薄的努力能为他 ...

  2. 使用 SQL Server 的 uniqueidentifier 字段类型

    原文:使用 SQL Server 的 uniqueidentifier 字段类型 SQL Server 自 2008 版起引入了 uniqueidentifier 字段,它存储的是一个 UUID, 或 ...

  3. Linux下防止文件误删方法

    转载:http://coolsky.blog.51cto.com/177347/1230332 Linux系统中,在root帐号下使用rm * -rf是非常危险的,一不小心就可能删除系统中的重要文件. ...

  4. eclipse中jar包打断点

    eclipse中jar包打断点 1. 下载工具 链接:http://pan.baidu.com/s/1dEF5tqL 密码:md4m 2. 增加jadeclipse功能 把 net.sf.jadcli ...

  5. Docker资源管理探秘:Docker背后的内核Cgroups机制

    http://www.infoq.com/cn/articles/docker-resource-management-cgroups 随着Docker技术被越来越多的个人.企业所接受,其用途也越来越 ...

  6. 查看HttpSession中存放了哪些值

    今天遇到了一个小问题,就是查看HttpSession中都存放了哪些值.解决办法如下: HttpSession session = request.getSession(); for ( Enumera ...

  7. nginx静态资源配置

    解决EE工程中静态文件显示问题 在工程中本地测试没有问题,发现使用nginx配置了路径的页面,会获取不到相应页面的静态文件问题 静态文件的路径类似为: http://localhost:8080/sa ...

  8. 编译安装Apache httpd和php搭建KodExplorer网盘

    编译安装Apache httpd和php搭建KodExplorer网盘 环境说明: 系统版本    CentOS 6.9 x86_64 软件版本    httpd-2.2.31        php- ...

  9. 时间操作(JavaScript版)—最简单比較两个时间格式数据的大小

    呵呵呵,在软件研发过程中假设遇到要比較两个时间的大小.你会怎么做.嗯嗯嗯,非常直观的做法就是把"-"去掉,再比較大小,真的有必要吗?看以下最简单的时间比較方式: <!DOCT ...

  10. UVa 10192 - Vacation &amp; UVa 10066 The Twin Towers ( LCS 最长公共子串)

    链接:UVa 10192 题意:给定两个字符串.求最长公共子串的长度 思路:这个是最长公共子串的直接应用 #include<stdio.h> #include<string.h> ...