Thread 的 stackSize

x33g5p2x  于2022-02-09 转载在 其他  
字(1.6k)|赞(0)|评价(0)|浏览(261)

一 点睛

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

测试结果如下。

| <br>stackSize<br> | <br>1<br> | <br>10<br> | <br>100<br> | <br>1 000<br> | <br>10 000<br> | <br>100 000<br> | <br>1 000 000<br> | <br>10 000 000<br> |
| <br>window10<br> | <br>9671<br> | <br>9660<br> | <br>9667<br> | <br>9668<br> | <br>205<br> | <br>836<br> | <br>9660<br> | <br>106888<br> |
| <br>Ubuntu 16.04<br> | <br>1284<br> | <br>1279<br> | <br>1285<br> | <br>1281<br> | <br>1287<br> | <br>1309<br> | <br>8661<br> | <br>95207<br> |

Windows 的测试结果不容乐观,Ubuntu 的测试结果还算合理。

从测试可以看到,随着 stackSize 数量级的不断增加,递归的深度也变得越来越大,该参数一般情况下不会主动设置,采用默认的值就可以了,默认情况下会设置为0.

相关文章