Thread 的 stackSize

一 点睛

一般情况下,我们在 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.


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