java线程多栈会溢出_JVM 栈(stack)溢出案例

介绍

当启动一个新线程时,JVM就会给这个线程分配一个Java栈(这个栈的内存大小由-Xss参数来设置)。

一个Java栈的基本单位是帧,每一次函数调用就会生成栈帧,占用一定的栈空间。当函数本身需要的内存过大,或者函数调用函数(依赖调用或者递归调用)太深,超过了-Xss设置的内存大小,就会抛出StackOverflowError异常。

-Xss:默认值 1M,控制每个线程占用的内存,这个参数决定了函数调用的最大深度。如果设置的太小可能会很容易出现 StackOverflowError 异常。

JDK 5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

示例代码

public class StackOverflow {

private static int deep = 1;

/**

* 通过无限递归来模拟栈溢出

*/

private static void recursion() {

deep++;

recursion();

}

public static void main(String[] args) {

try {

recursion();

} catch (Throwable e) { // catch 捕获的是 Throwable,而不是 Exception。因为 StackOverflowError 不属于 Exception 的子类。

System.out.println("Stack deep : " + deep);

e.printStackTrace();

}

// 不让进程结束,便于使用分析工具来查看内存情况

try {

Thread.sleep(24 * 60 * 60 * 1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

执行结果

Stack deep : 11429

java.lang.StackOverflowError

at com.song.StackOverflow.call(StackOverflow.java:16)

at com.song.StackOverflow.call(StackOverflow.java:17)

...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值