一般情况下,我们在 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.
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/chengqiuming/article/details/122849129
内容来源于网络,如有侵权,请联系作者删除!