这节课我们讲一下栈溢出,栈溢出主要是在做递归调用的时候,循环定义的情况下,可能会发生一个栈溢出的一个问题,就是抛出
栈异常,也就是一个最大的深度
package com.learn.test;
/**
* 栈溢出
* 这个你默认的话不一样的
* 最大深度可能跟每个的配置是不一样的
* 这个你无法去说的
* 我记得是1万2千多
* 具体数字我也忘记了
* 我们看一下默认深度是多少
* 这是默认的
*
* @author Leon.Sun
*
*/
public class Test005 {
private static int count;
public static void count() {
try {
/**
* 在count方法里面做了count++;
*/
count++;
/**
* 然后又调了count方法
* 这个叫做什么方法
* 这个叫做什么调用
* 递归方法一直在循环调用
*
*/
// count();
} catch (Throwable e) {
/**
* 在这里我们也把日志给打印出来了
* 他最多最大的深度是为多少
* 最大深度:10692
* java.lang.StackOverflowError
* 报了这个异常为什么
* 10692的最大深度
* 如果你想再调用更深的可以有一个配置的
* 你们可以去加大深度调用
* 我们需要配置这样一段话就行了
* 默认深度你不能说具体的
* 每个电脑的运行效果不一样的
* 所以这个不好说
* 只能说大概是多少
* 默认深度是10692
* 我们可以加大他的深度调用
* 我们同样进行配置
* Run as -> Run Application -> VM arguments
* -Xss5m
* 最大深度:252212
* 只要我配置5M,
* 这个深度是他的多少倍
* 基本上是20多倍
* 默认1M能调多少深度
* -Xss1m
* 最大深度:10694
* 1M的情况下是10694
* 大概我们的默认深度是1M
* 在这里给你说一个误区
*
*/
System.out.println("最大深度:" + count);
e.printStackTrace();
}
}
public static void main(String[] args) {
/**
* 这里有一个count方法
*/
// count();
/**
* 我在这里写一个for循环
* 我这么调用会不会产生栈溢出的问题
* 这叫不叫递归调用
* 会不会产生栈溢出的问题
* 这个不是递归
* 递归里面才会产生的
* 这个肯定不会的
* 没有报任何错吧
* 然后我把它加大一倍
* 是不是也没有报错
* 是肯定不会的
* 栈采用递归调用的情况下
* 栈溢出是产生于递归调用
* 循环遍历是不会的
*/
for (int i = 0; i < 20805; i++) {
count();
}
}
}
虚拟机栈溢出
错误原因: java.lang.StackOverflowError 栈内存溢出
栈溢出 产生于递归调用,循环遍历是不会的,但是循环方法里面产生递归调用, 也会发生栈溢出。
解决办法:设置线程最大调用深度
-Xss5m 设置最大调用深度