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)。");}
}