JVM -Xss

JVM -Xss 参数用来指定每个线程的虚拟机栈大小,直接的影响就是线程虚拟机栈的栈帧数量,即方法调用的层级深度。对应JVM里面名称为 ThreadStackSize 这个参数。

 

虚拟机栈的大小是否会影响JVM最大能够生成的线程数量呢?

首先,线程的虚拟机栈使用的内存空间在线程启动(即调用Thread类的start()方法)时,通过native方法,让操作系统创建一个与Thread对应的OS线程,同时会向操作系统申请线程的虚拟机栈使用的内存空间,但这里申请分配的是操作系统的虚拟内存,不是真实的物理内存,实际占用的内存空间小于等于 -Xss参数指定的大小,且受方法调用深度、方法参数影响,线程虚拟机栈使用的内存最大不会超过 -Xss 指定的大小,否则会抛出 StackOverFlow 栈溢出异常。

所以 -Xss 指定的大小理论上会影响能够生成的最大线程数量,但其实这个数量受操作系统的最大线程数配置、物理内存大小等的限制会更多一些,甚至可以说主要是操作系统的限制(实测PC机可以创建几万个线程而没有OOM,同时系统进入假死状态,非常卡)。

另外,JDK 11版本开始,创建线程时分配的线程虚拟机栈内存大小改为按实际需要分配,不再按最大空间分配,优化了内存利用率。

 

JVM -Xss参数值最小是多少?

在启动参数指定 -Xss10k,跑一个简单的main方法,结果如下:

 可以看到,JVM启动失败,stack size太低,最少需要108k。

由此,也可以反向推出,JVM新建一个线程最小需要108k的内存空间(JDK版本1.8,不同JDK版本、不同虚拟机该数值均不同)。

 (以上讨论默认JVM为HotSpot虚拟机)

posted @ 2023-03-16 17:41  zhaoyue1215  阅读(628)  评论(0编辑  收藏  举报