java线程栈和main线程栈的差异

66 阅读2分钟

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

本篇文章带大家了解一下线程栈之间的差异

线程栈最大深度演示

我们使用递归调用测试最大main线程的栈深度,代码如下:

image.png

我们使用递归调用测试最大普通线程的栈深度,代码如下:

image.png 测试结果对比:

  • main线程最大栈深度:23766,38179,41037
  • 普通线程最大栈深度:32281,33387,22644

我们知道栈里有局部变量表,那如果我们把 局部变量变大,或者把栈容量变小,我们来看看栈深度如何变化。

栈容量改变

我们改变栈容量的方式,可以通过虚拟机的参数-Xss,好,我们来设置128k试一下:

-Xss128k,我们可以看到栈深度减小了。

image.png

那这个参数是针对main线程的,还是针对所有的线程呢?我们需要测试一下其它线程:

image.png

我们可以看到这个参数是全局的参数。

局部变量改变栈深度

那接下来呢,我们测试一下,局部变量的大小是如何影响栈深度的。

加了这么几个局部变量 image.png

然后我们看一看结果:

  • main线程最大栈深度:16365,16048,27110,小了很多对叭,每个栈的使用的容量多,栈深就会减小。

总结

我们来总结一下,线程栈的深度主要是受两个因素影响,一个就是单个栈的容量,另一个就是栈总体的容量,都会影响栈的深度,hotspot虚拟机是不支持动态栈扩展的,所以当你调用的栈深度过深超过虚拟机给定的栈深度,就会抛出栈溢出。