本文重点讲解线程与虚拟机栈的关系。
虚拟机栈:与程序计数器、本地方法栈都是属于线程私有的JVM内存区域。虚拟机栈的生命周期是和线程相同的,是在JVM运行时创建的,在线程中,方法在执行的过程中会创建一个栈帧。主要用于存放局部变量表、操作栈、动态链接、方法出口等信息。一般将栈帧内存的大小称为宽度,而栈帧的数量被称为虚拟机栈的深度。虚拟机栈的大小可以通过参数-xss配置。因此在同等大小的虚拟机栈下,如果局部变量表等占用的内存越小,虚拟机栈的深度越大。如图:
因此虚拟机栈的内存大小会直接影响线程创建的数量。假定内存中的堆内存的大小不变都是512M,虚拟机栈的大小会直接影响可创建线程数量的大小。虚拟机栈内存越大可创建的数量越小。即:JVM内存 = 堆内存 + 线程数量 * 栈内存。
在不同的操作系统版本中,最大的地址空间是不一样的。32位的Windows最大是2G内存,因此可以得到这样的计算公式:
线程数 = (最大内存地址 - Xmx - 系统保留内存)/ Xss
当然线程数量和系统的内核配置还是有很大的关系。