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

428
17 февраля 2017, 01:01

Какие есть способы получить размер объекта в памяти? Можно не обязательно в рантайме (кодом).

Answer 1
  1. Записать в мемори стрим и измерить его.
  2. Используя адские хаки указатели добраться до метаинформации типа CLR
  3. sizeof() для стандартных типов и пользовательских структур без ссылок на референсные типы (иначе будет возвращаться размер указателя).
  4. Воспользоваться профайлером.

Первые три способа работают в рантайме.

Answer 2

Можно использовать WinDBG с psscor4.dll для платформы .NET (ещё есть Son of Strike но для Вашей задачи достаточно psscor4 (для CLR версии 2.* нужно взять psscor2)).

  1. Запускаем WinDbg от имени администратора желательно.
  2. Аттачимся к нашему процессу.
  3. Загружаем psscor4: .load C:\Symbols\Psscor4\x86\x86\psscor4.dll - путь тут нужно подставить свой.
  4. Ищете Ваш объект. Тут есть несколько способов, например, самый простой для простых тестов памяти это выполнить команду !DumpHeap и вы увидите например такое:

  5. Дальше выполняем команду !DumpHeap /d -mt 00414da0, где 00414da0 - адрес Вашего объекта. И видим:

  6. И последний шаг (в этом простом примере): это выполнить команду получения размера объекта по его адресу: !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; }
}
Answer 3

Можно с ClrMD поиграться, сделать дамп процесса и пройтись по куче Walking Managed Objects in the Process

READ ALSO
Как устранить конфликт? [требует правки]

Как устранить конфликт? [требует правки]

Как устранить конфликт?

364
EntityFramework работа с базой в библиотеке

EntityFramework работа с базой в библиотеке

Я только начинаю вникать в EntityFramework и у меня сразу возникло множество вопросовВот некоторые из них

363