GetAllocatedBytesForCurrentThread() 是如何工作的?如何通过线程获取已用内存?

how GetAllocatedBytesForCurrentThread() works? how to get used memory by a thread?

我需要一种方法来分析和记录 .net 核心项目中线程使用的内存量。 我发现了这个有趣的方法:GC.GetAllocatedBytesForCurrentThread();

正如方法名称所说,我希望获得线程使用的字节数,但我得到的却是非常高的值,例如:26111439440 字节,这是不可能的,因为与任务管理器上使用的内存不匹配,并且我机器上的可用内存。

您是否知道另一种与 .net core 2.0 兼容的方法可以实现我的目的?

UPDATE:

GetAllocatedBytesForCurrentThread() 被窃听,return 的值没有意义。

我不知道是否相关,但已经有一个与我的情况类似的错误(现已关闭):https://github.com/dotnet/coreclr/issues/10207 我在那里报道了

GetAllocatedBytesForCurrentThread() Returns 线程使用的累积内存,而不是当前使用的内存量,因此如果线程继续分配和释放内存,函数可以 return 非常高的值即使你从来没有同时使用过这么多内存

WORKAROUND:

无法获取线程使用的可靠内存,但可以获取进程使用的内存:

Process currentProcess = Process.GetCurrentProcess();
long memory = currentProcess.WorkingSet64;

如果您在启动线程之前和之后计算内存,您可以估计线程使用的内存。

GC.GetAllocatedBytesForCurrentThread returns 当前线程分配的累计字节总数,即使这些分配已被垃圾收集器清除。它不 return 当前使用的内存量。为此,您可以使用 Process.WorkingSet64Process.PrivateMemorySize64,具体取决于您要测量的内容。

26111439440 只有 24.3 GiB,对于一个需要大量内存的程序来说,在其生命周期内分配内存似乎是相当合理的。