当前位置: 首页 > 知识库问答 >
问题:

Java线程堆栈内存占用

谯乐池
2023-03-14

当我研究线程及其占用的内存(线程堆栈)时,我决定做一个简单的负载测试,看看线程的数量如何影响我的计算机上的RAM。

所以,在测试中,我使用了Tomcat,在设置中。xml将最小和最大web容器线程池设置为200。在那之后,我在将pool设置为2000时也做了同样的操作。我很震惊,因为内存占用没有差异(通过Windows任务管理器进行检查),而且几乎是一样的。所以我认为这些线程可能必须处于运行状态,使用负载测试工具“轰炸”服务器,我已经设法完成了一些重载,大多数线程现在都处于运行状态,但200到2000个线程之间的内存消耗没有变化。

所以我想知道这个线程的堆栈内存是关于什么的,这些结果是否意味着在创建线程时线程堆栈上的内存没有分配?我如何才能模拟线程堆栈内存增长到图上“肉眼”可以看到RAM消耗差异的大小?

提前感谢!

共有1个答案

李新霁
2023-03-14

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

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

您还可以在Java内跟踪堆栈内存使用情况,如果您最近使用了-XX: NativeMemoryTrackand jcmd的JDK,详情请参见此处。

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

 类似资料:
  • 在C语言中,我可以用下面的小程序来耗尽堆栈内存区域(我的Mac中堆栈大小的限制是8MB) 由于数组是Java也是一个对象,它的元素存储在堆中。根据Oracle的文档,默认的线程堆栈大小在MAC中为512KB。是否有任何程序可以耗尽堆栈大小?

  • 问题内容: 是局部变量,将其存储在堆或堆栈中的何处? 问题答案: 在堆上。每当您用来创建对象时,它都会在堆上分配。

  • 我正在为我的计算机科学专业学习C语言的操作系统课程。 我很好奇这是否与分配内存时浪费的空间有关,以及这是否在任何计算机操作系统上有所不同,我理解内存的排列方式可以以最适合系统的任何顺序进行。

  • 我们Java开发人员有时会使用来确保我们为每个特定于线程的堆栈提供了1MB的空间。现在,我经常感到困惑,JVM从哪里借用了1MB,从堆或系统内存中借用,或者Java为线程分配任何特定的内存。你能帮我理解一下吗? 此外,我们是否有一个可视化(插件)运行时工具,可以以可理解的方式显示堆和堆栈的内容? 提前感谢。

  • 本文向大家介绍java 中堆内存和栈内存理解,包括了java 中堆内存和栈内存理解的使用技巧和注意事项,需要的朋友参考一下  Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存

  • 问题内容: 有没有办法找出我的Java线程在虚拟机中占用多少内存? 例如,使用堆栈跟踪转储或其他某种方式。 问题答案: Java线程将堆用作共享内存。各个线程都有其堆栈(您可以通过-Xss命令行选项设置其大小,默认为512KB),但是所有其他内存(堆)都不属于特定线程,并询问一个特定线程仅使用了多少内存没有道理。