Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Как узнать размер объекта?

#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

Комментариев нет:

Отправить комментарий