我需要一种方法来分析和记录.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;
如果您在启动线程之前和之后计算内存,则可以估计该线程使用的内存。
答案 0 :(得分:1)
GC.GetAllocatedBytesForCurrentThread
返回当前线程分配的累积字节总数,即使那些分配已经被垃圾收集器清除了。它不会返回当前正在使用的内存量。为此,您可以使用Process.WorkingSet64
或Process.PrivateMemorySize64
,具体取决于要测量的内容。
26111439440仅为24.3 GiB,这对于在其生命周期中分配了大量内存的程序来说是很合理的。