是否可以为每个线程计算内存消耗? 假设我将任务分成4个线程,那么我想知道每个线程的内存消耗有多少? 我需要了解来自线程的平均和峰值内存使用情况。
是否可以为每个线程计算内存消耗? 假设我将任务分成4个线程,那么我想知道每个线程的内存消耗有多少? 我需要了解来自线程的平均和峰值内存使用情况。
Executor
实现上进行安排,例如 ThreadPoolExecutor
。因此,这是一种 多对多 的关系。 - Holger如果你关注线程在运行jvm时消耗的确切堆大小,可以使用内存分析器如visualvm查看线程创建的类和对象,并估算其消耗大小。
你还可以使用ThreadLocal变量来定义属于特定线程的对象。这也可以帮助你按线程基础获得确切的内存消耗。
你还可以查看ThreadMXBean,但这在最新的jvm中已不再可用。
-XX:+UnlockDiagnosticVMOptions -XX:NativeMemoryTracking=summary -XX:+PrintNMTStatistics
。java -XX:+UnlockDiagnosticVMOptions -XX:NativeMemoryTracking=summary -XX:+PrintNMTStatistics -jar myjar.jar
现在,如果你运行:
$jps -l
查找您计算机上的Java进程,然后
$jcmd <PID> VM.native_memory
Native Memory Tracking:
Total: reserved=2344374KB +4399KB, committed=567362KB +19659KB
...
- Thread (reserved=87894KB, committed=19126KB +756KB)
(thread #159)
(stack: reserved=87132KB, committed=18364KB +756KB)
(malloc=577KB #956)
(arena=184KB #316)
...
通过这些信息,您可以进行19126KB/159=120KB的计算,获取每个线程的平均承诺内存大小。但问题在于,这种方法无法提供每个线程的具体情况,有些线程可能较大,而其他线程可能较小。
您还可以尝试以下方法:
$jcmd <PID> VM.native_memory baseline
$jcmd <PID> VM.native_memory summary.diff
这将告诉您基准时间点和在高峰交通期间运行的差异。
需要注意的是:启用NMT会带来一些额外的开销。您可能需要权衡在启用此功能的情况下在PROD中运行应用程序的风险。