Сколько памяти использует объект C # / .NET?

Я разрабатываю приложение, в котором в настоящее время созданы сотни объектов.

Можно ли определить (или приблизительное) память, выделенную объектом (экземпляр classа)?

9 Solutions collect form web for “Сколько памяти использует объект C # / .NET?”

Вы можете использовать профилировщик памяти, например

Профайлер памяти .NET ( http://memprofiler.com/ )

или

Провайдер CLR (бесплатно) ( http://clrprofiler.codeplex.com/ )

Грубым способом может быть это в случае, если вы хотите знать, что происходит с конкретным объектом

// Measure starting point memory use GC_MemoryStart = System.GC.GetTotalMemory(true); // Allocate a new byte array of 20000 elements (about 20000 bytes) MyByteArray = new byte[20000]; // Obtain measurements after creating the new byte[] GC_MemoryEnd = System.GC.GetTotalMemory(true); // Ensure that the Array stays in memory and doesn't get optimized away GC.KeepAlive(MyByteArray); 

можно было бы получить доступ к широкому спектру процесса, возможно,

 long Process_MemoryStart = 0; Process MyProcess = System.Diagnostics.Process.GetCurrentProcess(); Process_MemoryStart = MyProcess.PrivateMemorySize64; 

надеюсь это поможет 😉

Профайлер памяти ANTS скажет вам, сколько всего выделено для каждого объекта / метода / и т. Д.

Вот связанный пост, где мы обсудили определение размеров ссылочных типов.

Вы также можете использовать WinDbg и SOS или SOSEX (например, SOS с большим количеством команд и некоторыми существующими улучшениями) расширениями WinDbg. Команда, которую вы будете использовать для анализа объекта по определенному адресу памяти: objsize

Один ОЧЕНЬ важный элемент для запоминания – это то, что objsize дает только размер самого classа и НЕ обязательно включает размер совокупных объектов, содержащихся внутри classа, – я понятия не имею, почему он этого не делает, поскольку это вполне иногда разочаровывает и вводит в заблуждение.

Я создал 2 предложения функций на веб-сайте Connect, которые просят включить эту возможность в VisualStudio. Пожалуйста, проголосуйте за предметы, которые вы хотели бы увидеть, добавив их!

https://connect.microsoft.com/VisualStudio/feedback/details/637373/add-feature-to-debugger-to-view-an-objects-memory-footprint-usage

https://connect.microsoft.com/VisualStudio/feedback/details/637376/add-feature-to-debugger-to-view-an-objects-rooted-references

EDIT: Я добавляю следующее, чтобы прояснить некоторую информацию из ответа, предоставленного Чарльзом Бретаной:

  1. ОП задал вопрос о размере «объекта», а не «classа». Объект является экземпляром classа. Может, это и есть то, что вы имели в виду?
  2. Память, выделенная для объекта, не включает код JIT. Код JIT живет в собственной «JIT Code Heap».
  3. JIT только компилирует код в методе методом – не на уровне classа. Поэтому, если метод никогда не вызывается для classа, он никогда не компилируется JIT и, следовательно, никогда не выделяет память для него в куче JIT Code.

В стороне есть около 8 разных куч, которые CLR использует:

  1. Куча загрузчика: содержит структуры CLR и систему типов
  2. Высокочастотная куча: статика, таблицы методов, FieldDescs, карта интерфейса
  3. Низкочастотная куча: таблицы EEClass, ClassLoader и таблицы поиска
  4. Stub Heap: заглушки для CAS, COM-обертки, P / Invoke
  5. Большая куча объектов: выделение памяти, для которой требуется более 85 тыс. Байт
  6. GC Heap: выделенная пользователем куча памяти, приватная для приложения
  7. JIT Code Heap: память, выделенная mscoreee (Execution Engine) и JIT-компилятор для управляемого кода
  8. Process / Base Heap: interop / неуправляемые распределения, встроенная память и т. Д.

НТН

Чтобы получить общий смысл для выделения памяти в приложении, используйте следующую команду sos в WinDbg

 !dumpheap -stat 

Обратите внимание, что! Dumpheap дает только байты самого типа объекта и не включает байты любых других типов объектов, которые он может ссылаться.

Если вы хотите увидеть общие сохраненные байты (суммировать все байты всех объектов, на которые ссылается ваш объект) определенного типа объекта, используйте профайлер памяти, например dot Trace – http://www.jetbrains.com/profiler/

Каждый «class» требует достаточно памяти для хранения всего этого jit-скомпилированного кода для всех его членов, которые были вызваны средой выполнения (хотя, если вы не назовете метод довольно долгое время, CLR может освободить эту память и re-jit снова, если вы снова назовете это … плюс достаточно памяти для хранения всех статических переменных, объявленных в classе … но эта память выделяется только один раз для каждого classа, независимо от того, сколько экземпляров создаваемого classа.

Для каждого экземпляра classа, который вы создаете (и не был собран Мусор), вы можете приблизить объем памяти, добавив использование памяти каждой объявленной переменной на основе экземпляра … (поле)

ссылочные переменные (ссылки на другие объекты) принимают 4 или 8 байтов (32/64 бит ОС) int16, Int32, Int64 принимают 2,4 или 8 байтов, соответственно …

строковая переменная принимает дополнительное хранилище для некоторых элементов метаданных (плюс размер указателя адреса)

Кроме того, каждая ссылочная переменная в объекте также может рассматриваться как «косвенно», включая память, занятую кучей объектом, на который он указывает, хотя вы, вероятно, захотите считать эту память как принадлежащую этому объекту, а не переменной, которая ссылается на это …

и т.д.

Если можно – сериализуйте его!

 Dim myObjectSize As Long Dim ms As New IO.MemoryStream Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter() bf.Serialize(ms, myObject) myObjectSize = ms.Position 

Существует академический вопрос: Каков размер объекта во время выполнения? И это интересно, но на него можно ответить только профилировщиком, подключенным к запущенному процессу. Я довольно долго смотрел на это недавно и решил, что нет универсального метода, который бы был точным и достаточно быстрым, чтобы вы когда-либо захотели использовать его в производственной системе. Простые случаи, такие как массивы числовых типов, имеют легкие ответы, но помимо этого лучшим ответом будет « Не утруждайте себя попыткой его выработать». Почему вы хотите это знать? Есть ли другая информация, которая может служить той же цели?

В моем случае я решил ответить на этот вопрос, потому что у меня были разные данные, которые были полезны, но их можно было отбросить, чтобы освободить ОЗУ для более важных сервисов. Мальчиками-плакатами здесь являются « Отскок» и « Кэш» .

В конце концов я пришел к выводу, что правильный способ управления размером стека отмены и кеша состоял в том, чтобы запросить объем доступной памяти (это 64-битный процесс, поэтому можно с уверенностью предположить, что он все доступен), а затем разрешить большее количество элементов для добавления, если имеется достаточно большой буфер ОЗУ и требуется, чтобы элементы были удалены, если ОЗУ работает на низком уровне.

Interesting Posts

Android Studio, как упаковать один AAR из нескольких проектов библиотеки?

Использует ли компьютер меньше ресурсов, когда программы сведены к минимуму?

Используйте Invoke-WebRequest с именем пользователя и паролем для базовой проверки подлинности в API GitHub

В WPF есть свойство DesignMode?

Android: Как создать уведомление «Ongoing»?

Экранная клавиатура для сенсорного дисплея

Как запустить приложение с аргументами командной строки в Mac OS

Как удалить учетную запись из приложения Mail в Windows 8?

Команда xset dpms не отключает монитор

Как открыть новое окно с помощью MVVM Light Toolkit

Как установить переменные среды в Jenkins?

Вероятность столкновения с использованием наиболее значимых бит UUID в Java

Как использовать выражения указателя для доступа к элементам двумерного массива в C?

Установите окна 8 на одном компьютере дважды

Openvpn нет доступа – нет пути к хосту

Давайте будем гением компьютера.