Java线程栈内存占用

标签 java multithreading tomcat jvm

当我研究线程及其消耗的内存(线程堆栈)时,我决定 进行简单的负载测试,看看线程数如何影响我计算机上的 RAM。

因此,对于测试,我使用了 Tomcat,并在 settings.xml 中设置了最小和最大 web 将容器线程池设置为 200。之后我做了同样的事情,将池设置为 2000。 我很震惊,因为内存占用没有差异(正在检查 Windows 任务管理器)几乎是一样的。所以我想也许这些线程有 为了处于运行状态,使用负载测试工具“轰炸”服务器,我已经成功了 为了执行一些重负载,大多数线程现在处于运行状态,但没有 200 到 2000 个线程之间内存消耗的变化。

所以我想知道这个线程的堆栈内存是什么以及这些结果意味着什么 创建线程时,线程堆栈上的内存未分配?我会怎样 能够模拟线程堆栈内存增长到 RAM 消耗差异的大小 在图表上可以“肉眼”看到吗?

提前致谢!

最佳答案

线程堆栈分配在 native 内存中(而不是Java堆中),默认堆栈大小在256k到1M之间(取决于操作系统以及JVM是32位还是64位),您可以控制它使用 -Xss JVM 选项。如果堆栈内存不足,则会收到“java.lang.OutOfMemoryError:无法创建新的 native 线程”错误。

如果您想在操作系统级别跟踪 Windows 上的堆栈内存使用情况,请使用 VMMap而不是任务管理器,因为它显示堆栈内存。

如果您有最新的带有 -XX:NativeMemoryTracking 和 jcmd 的 JDK,您还可以跟踪 Java 中的堆栈内存使用情况,详细信息为 here .

我不知道你的测试出了什么问题,我建议在你的代码中放置一个 Thread.sleep 以确保所有线程都在运行。

关于Java线程栈内存占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26585584/

相关文章:

C++:#including <thread> 重新定义 winsock 函数 bind(...)?

java - JSP 和 OAUTH2 身份验证

java - 我的 WebApp 如何通过 Tomcat Valve 检索数据集?

Java 数据包困惑

c++ - 我应该更喜欢 std::thread 还是 Boost 线程?

multithreading - 在独立 Perl 脚本中使用 Mojo::Promise

java - 独立于 IDE 构建 Maven 项目(尤其是 eclipse)

java - Hibernate 注释上的映射问题

java - 数组长度不同?

java - 如何缓存 Apache CXF 为特定 Java 对象生成的编码 SOAP XML 以提高性能?