一、思考
对于这个问题,我是这样想的:
我们知道栈大小是可以通过参数(-Xss)设置的,栈是线程私有的,线程内部的每个方法调用会创建一个栈帧,所以如果“
栈帧的数量*每个栈帧的大小>栈大小
”时便会发生“栈溢出”。
这样的设想基于:
- -Xss设置的参数是针对每一个栈的,而非JVM所有线程栈内存总大小。
- 每个方法的调用将创建一个栈帧。
-
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 版权协议,转载请附上原文出处链接和本声明。