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

这个大小是"每个线程的栈空间",即每创建一个线程都会分配这么多内存给它的栈。


如何查看默认值

你可以在命令行里运行:

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)。");
    }
}
相关推荐
MC丶科19 小时前
Java设计模式漫画英雄宇宙-工厂模式 —Factory博士的“超级英雄制造机”!
java·设计模式·漫画
码一行19 小时前
Go.1.25.4 和 Go.1.24.10 发布了!!
后端·go
虎子_layor19 小时前
告别Redis瓶颈:Caffeine本地缓存优化实战指南
java·后端
q***985219 小时前
什么是Spring Boot 应用开发?
java·spring boot·后端
带刺的坐椅19 小时前
Solon AI 开发学习4 - chat - 模型实例的构建和简单调用
java·ai·chatgpt·solon
hadage23319 小时前
--- JavaScript 的一些常用语法总结 ---
java·前端·javascript
码一行19 小时前
从0到1用Go撸一个AI应用?Eino框架让你效率翻倍!
后端·go
掘金一周19 小时前
大部分人都错了!这才是chrome插件多脚本通信的正确姿势 | 掘金一周 11.27
前端·人工智能·后端
懂得节能嘛.19 小时前
【Java动态线程池】Redis监控+动态调参
java·开发语言·redis