java 栈 最大深度
2018-01-27 19:38
148 查看
1. 概述
某公司面试,总监大叔过来,问了图论及栈的最大深度,然后^_^
一直记着,今天搞一下
2. 代码
控制台输出
java.lang.StackOverflowError
stack height:11421
3. 总结
3.1 java栈是java虚拟机的一个重要的组成部分,在栈里进行线程操作,存放方法参数等等。
栈在初始化过后是有一定的大小的。
栈的高度称为栈的深度,栈深度受栈帧大小影响。
我们知道,在栈中存放局部变量,参数,运行中间结果等。
3.2 增加参数(因为方法参数需要占用内存 所以栈可为方法本身占用的地方就减少了)
控制台输出
java.lang.StackOverflowError
stack height:9654
3.3 进一步,
3.3.1 增加局部变量 数量
控制台输出
java.lang.StackOverflowError
stack height:7854
3.3.2 增大变量值
控制台输出
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
某公司面试,总监大叔过来,问了图论及栈的最大深度,然后^_^
一直记着,今天搞一下
2. 代码
package com.goodfan.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
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
相关文章推荐
- 【LeetCode-面试算法经典-Java实现】【104-Maximum Depth of Binary Tree(二叉树的最大深度)】
- 树的最大深度 leecode java
- 观察java中栈的最大递归深度
- 【LeetCode-面试算法经典-Java实现】【104-Maximum Depth of Binary Tree(二叉树的最大深度)】
- 【leetcode Java】二叉树的递归遍历以及最大深度的求解(Java)
- java 求二叉树最大深度算法
- Java代码分别用递归和非递归方式计算二叉树的最大深度
- Java:树的最大深度
- 97. 二叉树的最大深度--java
- 二叉树最大深度(Java)
- [Java代码] [Leetcode] Maximum and Minimum Depth of Binary Tree 二叉树的最小最大深度
- Maximum and Minimum Depth of Binary Tree 二叉树的最小最大深度 [java]
- Java实现二叉树的先序、中序、后序、层次遍历,数的最大深度、最大宽度
- leetcode解题之Maximum/Minimum Depth of Binary Tree Java版(树的最大、最小深度)
- 深度解析Java内存的原型
- java输入多个数据(不确定),排序,并求最大值
- 关于 Java 中 finally 语句块的深度辨析(转载)
- Java 8 获取某天最大(23:59:59)最小(00:00:00)时间
- CCF 201612-1 最大波动 JAVA实现
- JAVA CAS原理深度分析