等待状态的线程对java进程内存的影响

我试图找出最好的方法来确定线程在等待状态对java进程(更具体地说是内存而不是cpu)的影响。 任何可以帮助我弄清楚其影响的建议(可能通过jvisualvm / jconsole等)将不胜感激。

更新 :当前线程数在等待状态下是几百个 – 大约500个。我正在试图找出检查它是否能够/将对旧一代GC产生任何潜在影响的最佳方法。

我试图找出最好的方法来确定线程在等待状态对java进程(更具体地说是内存而不是cpu)的影响

单个线程的影响将非常小。 每个线程都被分配了一定数量的堆栈空间内存,这些内存是在堆外部分配的。 我认为64位机器通常为512k或1M。 这可以使用-XX:ThreadStackSize=YYY JVM参数进行自定义,其中YYY是以千字节为单位的堆栈大小。

堆上还有Thread对象本身以及JVM保存的各种记帐数据。 当然,也需要考虑线程拥有的任何对象。

你担心这个空间的唯一一次是你计划拥有1000个线程或者内存限制非常有限。

线程的内存使用情况可以在概念上划分为:

  • 线程堆栈(我相信默认为2MB,但可以使用-Xss VM选项更改和/或在Thread构造函数中指定)

  • java线程对象和关联对象(位于VM堆中)。 对于给定的实现,实际上是恒定的。 只有几KB。

  • 本机开销 – 管理线程所需的内核内存。 应该可以忽略不计(几KB)。

  • 由线程管理的用户数据(可通过其线程对象或本地变量访问的数据)。 可以变化很大。

前三个元素很容易测量(它们实际上与VM实例一致,随线程数线性扩展),最后一件事完全取决于线程代码/数据。

由于堆栈大小通常在每个线程成本中占主导地位(与内核开销和线程对象相比),因此等待线程的内存影响可以简化为其堆栈大小。

对于仅虚拟影响(分配地址空间)的虚拟内存系统,但不一定分配物理内存量(未使用的堆栈空间永远不会分配物理内存页)。 当您创建许multithreading时,32位系统可能会非常快地耗尽地址空间(例如:1000个线程乘以2MB堆栈大小= 2GB)。