java 线程栈内存大小_关于 Java 应用的 线程栈内存大小

关于 Java 应用的 线程栈内存大小

作者: 认真生活每一天  更新时间:2021-01-29 08:13:00  原文链接

右侧开启环境实践本页内容

对于 Java 应用, 对于内存的占用, 主要是Java堆, 通常我们为了性能考虑, 会对堆设置最大值, 否则 JVM 就会根据它锁了解的系统参数, 设置一个可能的最大值. 除了堆之外, 其实还有好几部分, 也可能占用不少内存. 比如元数据区(老年代), 线程栈, 编译后的代码, GC 程序, 编译器, JVM符号表之类的. 这里可以通过添加启动参数: -XX:NativeMemoryTracking=summary or -XX:NativeMemoryTracking=detail 来追踪原生内存的占用. 比如:

java 线程栈内存大小_关于 Java 应用的 线程栈内存大小_第1张图片

比如上面的截图中, kiyomi 看到 Thread 部分 reserve 了 1052M, 已经提交占用了 1052M, 查看 thread dump, 发现现在大概有 1003 个线程, 基本每个线程占用 1M.

另外我们知道, 可以使用 Xss 参数设置每个线程栈的大小, 比如:

-Xss1m

-Xss1024k

-Xss1048576

上面的参数等同于:

-XX:ThreadStackSize

可以看到具体的说明.

从上面的文档可以看出, 每个栈在 64bit 的 Linux 上使用 1M, 可是我从另外一个机器上看到大概有 20K 个线程, 可是占用的内存并不是 20G. 于是我们看到 对于 IBM JDK 和 OpenJ9 JDK 它们都用 3 个参数:

-Xiss Set initial Java thread stack size 2 KB

-Xss Set maximum Java thread stack size 320 KB (31/32-bit); 1024 KB (64-bit)

-Xssi Set Java thread stack size increment 16 KB

这里它们对 Xss 的解读是最大的可用栈大小. 所以, 就有个疑问, 对于 HotSpot JDK, 是每个栈必须占用 1M, 还是这也是最大值???

更新:

应该是最大值, 之前的 NMT 简单的把 reserved 和 commited 置成 线程数 * Xss. 其实真正的 committed 可能并么有这么多, 虽然声明使用 1M 虚拟内存, 可能实际使用的物理内存页比较少. 所以 commited 比较少.

你可能感兴趣的:(java,线程栈内存大小)