携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
本篇文章带大家了解一下栈容量,如果你不指定栈容量的话,默认就是初始容量,那这初始容量是多少呢?今天我们就带大家来了解一下。
线程栈大小的源码解析
线程的初始化构造方法,最后一个参数就是这个stackSize,默认就是0
这个地方没有表明,因此我们需要看源码,首先我们需要找到线程的启动入口,然后往下翻找到stacksize如下:
这里就是获取我们设置的stakSize属性,如果设置了,就获取,没有设置就赋值为0
然后到了创建线程的方法:
然后从这个方法接着往下走,走到操作系统创建线程的方法,我们看的是Linux的:
然后找到设置这个默认值的方法,因为这里我们的stack_size还是0,所以就会进入这个默认值的方法
然后从这里我们能看出默认的栈大小编译线程是4M,非编译线程是1M,我们的java线程不是编译线程,所以是1M,这里的AMD64指的就是x86啊。
我们可以实践看一下这个数值,断点进入。
首先,我们找到这个方法,然后进入到分配的方法
然后分配完之后,我打印了一下这个数值是1048576,我们需要除以1024。
结果就是1024,正好是1M
这里还有个比较方法,我们看看linu给的默认值是多少,是228k,也就是说如果小于这个栈大小就会抛异常。
我们来测试一下:
当然数据仅供参考。