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

时间:2018-11-01 10:48:11

标签: c# memory .net-core garbage-collection profile

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

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

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

  

更新

GetAllocatedBytesForCurrentThread()有问题,返回的值没有意义。

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

GetAllocatedBytesForCurrentThread()返回线程使用的累积内存,而不是当前使用的内存量,因此,如果线程继续分配和释放内存,即使您从未使用过如此多的内存,该函数也可以返回很高的值。同时

  

WORKAROUND

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

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

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

1 个答案:

答案 0 :(得分:1)

GC.GetAllocatedBytesForCurrentThread返回当前线程分配的累积字节总数,即使那些分配已经被垃圾收集器清除了。它不会返回当前正在使用的内存量。为此,您可以使用Process.WorkingSet64Process.PrivateMemorySize64,具体取决于要测量的内容。

26111439440仅为24.3 GiB,这对于在其生命周期中分配了大量内存的程序来说是很合理的。