#c_sharp
Какие есть способы получить размер объекта в памяти? Можно не обязательно в рантайме (кодом).
Ответы
Ответ 1
Можно использовать WinDBG с psscor4.dll для платформы .NET (ещё есть Son of Strike но для Вашей задачи достаточно psscor4 (для CLR версии 2.* нужно взять psscor2)). Запускаем WinDbg от имени администратора желательно. Аттачимся к нашему процессу. Загружаем psscor4: .load C:\Symbols\Psscor4\x86\x86\psscor4.dll - путь тут нужно подставить свой. Ищете Ваш объект. Тут есть несколько способов, например, самый простой для простых тестов памяти это выполнить команду !DumpHeap и вы увидите например такое: Дальше выполняем команду !DumpHeap /d -mt 00414da0, где 00414da0 - адрес Вашего объекта. И видим: И последний шаг (в этом простом примере): это выполнить команду получения размера объекта по его адресу: !objsize 0df73294, где 0df73294 - адрес объекта. И видим: Мой код для теста: public static class Program { private static void Main() { MyObject myObject = new MyObject { S = "1234567895555555555555555555555555555555", Type = 0 }; Console.ReadKey(); // не забудьте приаттачится в нужный момент. Console.WriteLine(myObject); } } public class MyObject { public int Type { get; set; } public string S { get; set; } }Ответ 2
Записать в мемори стрим и измерить его. Используя адские хаки указатели добраться до метаинформации типа CLR sizeof() для стандартных типов и пользовательских структур без ссылок на референсные типы (иначе будет возвращаться размер указателя). Воспользоваться профайлером. Первые три способа работают в рантайме.Ответ 3
Можно с ClrMD поиграться, сделать дамп процесса и пройтись по куче Walking Managed Objects in the Process
Комментариев нет:
Отправить комментарий