Я хочу оценить размеры объектов в памяти с помощью диагностики, но я немного запутался: как размер всех объектов в памяти может быть больше общего размера памяти?
GC .GetTotalMemory() дает мне другое значение (меньшее), чем когда я перебираю все объекты в куче и суммирую их:
TotalSize: 22236, ObjectSize: 452999 >
А когда я смотрю в диспетчере задач, потребление памяти имеет другое значение (11,4 МБ)?
Так каково реальное потребление памяти? Моя цель — отслеживать наши объекты и потребление.
Что я делаю не так?
private static void EvaluateMemoryConsumption()
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
long totalMemory = GC.GetTotalMemory(forceFullCollection: false);
long totalObjSize = 0;
using (var dataTarget = DataTarget.AttachToProcess(Process.GetCurrentProcess().Id, suspend: false))
{
using (var runtime = dataTarget.ClrVersions[0].CreateRuntime())
{
foreach (var segment in runtime.Heap.Segments)
{
foreach (var obj in segment.EnumerateObjects())
{
totalObjSize += (long)obj.Size;
}
}
}
}
Console.WriteLine($"TotalSize: {totalMemory}, ObjectSize: {totalObjSize}");
// TotalSize: 22236, ObjectSize: 452999
}
Подробнее здесь: https://stackoverflow.com/questions/789 ... ts-in-code