JAVA—为什么递归太深会导致栈溢出

  • Post author:
  • Post category:java


一、思考

对于这个问题,我是这样想的:

我们知道栈大小是可以通过参数(-Xss)设置的,栈是线程私有的,线程内部的每个方法调用会创建一个栈帧,所以如果“

栈帧的数量*每个栈帧的大小>栈大小

”时便会发生“栈溢出”。

这样的设想基于:

  1. -Xss设置的参数是针对每一个栈的,而非JVM所有线程栈内存总大小。
  2. 每个方法的调用将创建一个栈帧。

  3. SUM(每个栈帧大小)>栈大小

    发生栈溢出。

接下来我们将分析一下我们的设想是否正确。

二、分析

2.1第一点:-Xss设置的参数是针对每一个栈的,而非JVM所有线程栈内存总大小


验证程序

//JVM参数:-Xss108k

//对比“一个线程栈溢出”和“两个线程栈溢出”时的栈深度,从而验证设置的栈大小是否只是限制一个线程栈 
//大小

private static int c1 = 0;
private static int c2 = 0;
public static void main(String[] args) {
    //线程一递归
	new Thread(() -> {
		try {
			m1();
		} catch (StackOverflowError error) {
			System.out.println("栈溢出 c1=" + c1);
		}
	}).start();
    //线程二递归
	new Thread(() -> {
		try {
			m2();
		} catch (StackOverflowError error) {
			System.out.println("栈溢



版权声明:本文为qq_31331965原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。