JVM默认栈大小
JVM 里线程栈的大小不是一个固定值,而是由 操作系统平台、JVM 实现版本、以及启动参数 共同决定的。
常见情况(以 HotSpot 为例):
- Linux / macOS
- 64 位 JVM 默认大约是 1M (1024 KB)
- 32 位 JVM 默认大约是 320 KB ~ 512 KB
- Windows
- 64 位 JVM 默认大约是 1M
- 32 位 JVM 默认大约是 320 KB ~ 512 KB
这个大小是“每个线程的栈空间”,即每创建一个线程都会分配这么多内存给它的栈。
如何查看默认值
你可以在命令行里运行:
java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
输出示例:
size 1024k 0 manageable -XX:ThreadStackSize
这里的 1024k
就是默认的线程栈大小。
如何修改
如果你希望调整(比如减少栈大小以允许创建更多线程,或增加栈大小以避免深递归导致的 StackOverflowError),可以通过参数:
java -Xss2m MyApp # 每个线程的栈大小设置为 2M
写一段 Java 小程序,可以直接打印出当前 JVM 的线程栈大小(通过反射或启动参数获取)
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.List;public class ThreadStackSizeDemo {public static void main(String[] args) {RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();List<String> inputArgs = runtimeMXBean.getInputArguments();// 查找 -Xss 参数String stackSize = inputArgs.stream().filter(arg -> arg.startsWith("-Xss")).findFirst().orElse("未显式设置(使用默认值)");System.out.println("线程栈大小参数: " + stackSize);// 提示:默认值要通过 java -XX:+PrintFlagsFinal | grep ThreadStackSize 来查看System.out.println("注意:如果没有显式设置 -Xss,则使用平台相关的默认值 (通常 1M for 64位JVM)。");}
}