一 点睛
一般情况下,我们在 Thread 的构造函数中不会去指定 stackSize,而是统一通过 xss 参数进行设置,当 stackSize 越大,代表着正在线程内方法调用递归的深度越深。
在某些平台下,越高的 stackSize 设定,可以允许的递归深度越深,反之,越少的 stackSize 设定,则递归深度越浅。当然在某些平台下,该参数压根就不起任何作用,如果该参数设置为0,也不起任何作用。
二 测试代码
package concurrent;
public class ThreadStackSize {
public static void main(String[] args) {
if (args.length < 1) {
System.out.println("请输入 stackSize");
System.exit(1);
}
ThreadGroup group = new ThreadGroup("TestGroup");
Runnable runnable = new Runnable() {
final int Max = Integer.MAX_VALUE;
@Override
public void run() {
int i = 0;
recurse(i);
}
private void recurse(int i) {
System.out.println(i);
if (i < Max) {
recurse(i + 1);
}
}
};
Thread thread = new Thread(group, runnable, "Test", Integer.parseInt(args[0]));
thread.start();
}
}
三 测试结果
测试脚本
E:\JVMDemo\demo2022\target\classes>java -Xmx512m -Xms512m concurrent.ThreadStackSize 1
最后一个参数依次换成 10,100...10 000 000
测试结果如下。
stackSize | 1 | 10 | 100 | 1 000 | 10 000 | 100 000 | 1 000 000 | 10 000 000 |
window10 | 9671 | 9660 | 9667 | 9668 | 205 | 836 | 9660 | 106888 |
Ubuntu 16.04 | 1284 | 1279 | 1285 | 1281 | 1287 | 1309 | 8661 | 95207 |
Windows 的测试结果不容乐观,Ubuntu 的测试结果还算合理。
从测试可以看到,随着 stackSize 数量级的不断增加,递归的深度也变得越来越大,该参数一般情况下不会主动设置,采用默认的值就可以了,默认情况下会设置为0.