线程栈大小的默认值源码解析与实践

456 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

本篇文章带大家了解一下栈容量,如果你不指定栈容量的话,默认就是初始容量,那这初始容量是多少呢?今天我们就带大家来了解一下。

线程栈大小的源码解析

线程的初始化构造方法,最后一个参数就是这个stackSize,默认就是0 image.png

这个地方没有表明,因此我们需要看源码,首先我们需要找到线程的启动入口,然后往下翻找到stacksize如下:

这里就是获取我们设置的stakSize属性,如果设置了,就获取,没有设置就赋值为0 image.png

然后到了创建线程的方法:

image.png

然后从这个方法接着往下走,走到操作系统创建线程的方法,我们看的是Linux的:

image.png

然后找到设置这个默认值的方法,因为这里我们的stack_size还是0,所以就会进入这个默认值的方法

image.png

然后从这里我们能看出默认的栈大小编译线程是4M,非编译线程是1M,我们的java线程不是编译线程,所以是1M,这里的AMD64指的就是x86啊。 image.png

我们可以实践看一下这个数值,断点进入。

首先,我们找到这个方法,然后进入到分配的方法 image.png

然后分配完之后,我打印了一下这个数值是1048576,我们需要除以1024。 image.png

结果就是1024,正好是1M

image.png

这里还有个比较方法,我们看看linu给的默认值是多少,是228k,也就是说如果小于这个栈大小就会抛异常。 image.png

我们来测试一下: image.png

当然数据仅供参考。