最近、Javaで(深い再帰関数呼び出しを実装しているときに)、スレッドのスタックサイズがプロセスよりも大きいことを確認しました。つまり、たとえば、スレッドは約30,000回の再帰呼び出しを実行できますが、スレッドのないプログラムは同じ関数に対して10,000回の再帰呼び出ししか実行できませんでした。
なぜそうなのか誰かが示唆できますか?
理解とコンテキストをよりよく理解するために、Javaコードをそのまま実行して、コンソールにメッセージが出力されるのを確認してください。
package com.java.concept;
/**
* This provides a mechanism to increase the call stack size, by starting the thread in the caller we can increase it
* Result were 3 times higher
*/
public class DeepRecursionCallStack {
private static int level = 0;
public static long fact(int n) {
level++;
return n < 2 ? n : n * fact(n - 1);
}
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(null, null, "DeepRecursionCallStack", 1000000) {
@Override
public void run() {
try {
level = 0;
System.out.println(fact(1 << 15));
} catch (StackOverflowError e) {
System.err.println("New thread : true recursion level was " + level);
System.err.println("New thread : reported recursion level was "
+ e.getStackTrace().length);
}
}
};
t.start();
t.join();
try {
level = 0;
System.out.println(fact(1 << 15));
} catch (StackOverflowError e) {
System.err.println("Main code : true recursion level was " + level);
System.err.println("Main code : reported recursion level was "
+ e.getStackTrace().length);
}
}
}