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
这个大小是"每个线程的栈空间",即每创建一个线程都会分配这么多内存给它的栈。
如何查看默认值
你可以在命令行里运行:
bash
java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
输出示例:
plain
size 1024k 0 manageable -XX:ThreadStackSize
这里的 1024k
就是默认的线程栈大小。
如何修改
如果你希望调整(比如减少栈大小以允许创建更多线程,或增加栈大小以避免深递归导致的 StackOverflowError),可以通过参数:
bash
java -Xss2m MyApp # 每个线程的栈大小设置为 2M
写一段 Java 小程序,可以直接打印出当前 JVM 的线程栈大小(通过反射或启动参数获取)
java
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)。");
}
}


