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)。");
    }
}
相关推荐
Yeats_Liao13 分钟前
Go Web 编程快速入门 11 - WebSocket实时通信:实时消息推送和双向通信
前端·后端·websocket·golang
R.lin16 分钟前
使用注解将日志存入Elasticsearch
java·大数据·后端·elasticsearch·中间件
滴滴滴嘟嘟嘟.39 分钟前
全屏定时提醒工具
java·开发语言
用户08067656925341 分钟前
蓝桥云课-罗勇军算法精讲课(Python版)视频教程
后端
用户08067656925341 分钟前
C#.NET高级班进阶VIP课程
后端
用户4014266958543 分钟前
Pandas数据分析实战(完结)
后端
用户842981424181044 分钟前
js中如何隐藏eval关键字?
前端·javascript·后端
用户9884740373811 小时前
reCAPTCHA v2与v3的核心差异及应对方案
后端
せいしゅん青春之我1 小时前
【JavaEE初阶】网络原理——TCP处理先发后至问题
java·网络·笔记·网络协议·tcp/ip·java-ee
星星落进兜里1 小时前
Spring全家桶面试题, 只补充细节版本
java·后端·spring