当我研究线程和它们消耗的内存(线程堆栈)时,我决定 做一个简单的负载测试,看看线程数如何影响我的计算机上的RAM。
因此,对于测试我使用了Tomcat,并在settings.xml中设置了最小和最大的web 容器线程池到200.之后我将池设置为2000时也做了同样的事情。 我感到震惊,因为记忆占用没有差别(正在检查 Windows Task Manger)和它几乎一样。所以我想也许那些线程有 处于运行状态,使用负载测试工具来轰击"服务器和我管理 为了做一些重负荷,大多数线程现在处于运行状态但没有 更改200到2000个线程之间的内存消耗。
所以我想知道这个线程的堆栈内存到底是什么,这些结果是什么意思 在创建线程时,是否分配了线程堆栈上的内存?我怎么样? 能够模拟线程堆栈内存增长到RAM消耗差异的大小 被视为肉眼"在图表上?
提前致谢!
答案 0 :(得分:1)
线程堆栈在本机内存(不在Java堆中)中分配,默认堆栈大小介于256 k和1 M之间(取决于操作系统以及JVM是32位还是64位),您可以控制它使用-Xss JVM选项。如果你的堆栈内存不足,你会得到“java.lang.OutOfMemoryError:无法创建新的本机线程”错误。
如果要在操作系统级别上跟踪Windows上的堆栈内存使用情况,请使用VMMap而不是任务管理器,因为它会显示堆栈内存。
如果最近的JDK使用-XX:NativeMemoryTracking和jcmd,您还可以跟踪Java中的堆栈内存使用情况,详细信息为here。
我不知道您的测试有什么问题,我建议在您的代码中放置一个Thread.sleep以确保所有线程都在运行。