我正在尝试确定找出线程在等待状态对java进程(更具体地说是内存而不是cpu)的影响的最佳方法。任何可以帮助我找出其影响的建议(可能通过jvisualvm / jconsole等)将不胜感激。
更新: 当前线程数在等待状态下是几百个 - 大约500个。我正在试图找出检查它是否能够/将对旧一代GC产生任何潜在影响的最佳方法。
答案 0 :(得分:2)
我正在尝试确定找出线程在等待状态对java进程(更具体地说是内存而不是cpu)的影响的最佳方法
单个线程的影响非常小。每个线程都被分配了一定数量的堆栈空间内存,这些内存是在堆外部分配的。我认为64位机器通常为512k或1M。这可以使用-XX:ThreadStackSize=YYY
JVM参数进行自定义,其中YYY
是堆栈的大小,以千字节为单位。
堆上还有Thread
对象本身以及JVM保存的各种记帐数据。当然,也需要考虑线程所拥有的任何对象。
你担心这个空间的唯一一次是你计划拥有1000个线程或者内存限制非常有限。
答案 1 :(得分:2)
线程的内存使用情况可以在概念上划分为:
线程堆栈(我相信默认为2MB,但可以使用-Xss VM选项更改和/或在Thread构造函数中指定)
java线程对象和关联对象(位于VM堆中)。对于给定的实现,实际上是恒定的。只有几KB。
本机开销 - 管理线程所需的内核内存。应该可以忽略不计(几KB)。
线程管理的用户数据(可通过其线程对象或局部变量访问的数据)。可以有很大差异。
前三个元素很容易测量(它们实际上与VM实例一致,随线程数线性扩展),最后一件事完全取决于线程代码/数据。
由于堆栈大小通常以每线程成本为主(与内核开销和线程对象相比),因此等待线程的内存影响可以简化为其堆栈大小。
对于仅虚拟影响(分配地址空间)的虚拟内存系统,但不一定分配物理内存量(未使用的堆栈空间永远不会分配物理内存页)。当您创建许多线程时,32位系统可能会非常快地耗尽地址空间(例如:1000个线程乘以2MB堆栈大小= 2GB)。