Как измерить количество памяти, которое отдельный объект занимает в .NET - PullRequest
9 голосов
/ 20 августа 2010

Мне интересно, есть ли простая команда или инструкция в C # /. NET и / или Visual Studio, которая может сказать мне, сколько памяти занимает отдельный объект?У меня есть подлое подозрение, что оператор sizeof () будет мне врать ... оправдан ли я в этом убеждении?

Есть несколько связанный с этим вопрос здесь , но не окончательныйдается ответ о том, как измерить отдельный объект

Ответы [ 4 ]

8 голосов
/ 20 августа 2010

Определенного пути не существует, потому что он не прост для любого типа объекта.

Что если этот объект содержит ссылки на другие объекты? Что если эти другие объекты имеют другие объекты, ссылающиеся на них? Какой объект на самом деле владеет этим пространством памяти? Это тот, кто его создал, или последний, кто прикоснулся к нему? В любой момент у него могут быть разные владельцы. Или вас волнует, сколько места занимает ссылка?

Существует также множество вопросов, которые также задали этот вопрос ... появляется быстрый поиск:

Как получить размер объекта в памяти?

C #: использование памяти объектом

Узнать размер объекта .net

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

и список можно продолжить ...

3 голосов
/ 05 июля 2011

Если можешь - сериализуй!

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
3 голосов
/ 20 августа 2010

Простого пути нет, и sizeof подойдет только для типов значений.Типичный объект содержит ссылки на списки и другие объекты, поэтому вам нужно будет перебрать все указатели, чтобы получить действительное количество байтов, а также добавить размеры указателей.

Вы можете проверить .Net ProfilingAPI, или используйте профилировщик памяти, такой как dotTrace.Профилировщик памяти, по крайней мере, поможет вам увидеть, где выделяется память и является ли выделение памяти проблемой в вашем приложении.Это часто более полезно, чем фактический размер объекта.

1 голос
/ 20 августа 2010

Интересно, как работает System.Runtime.InteropServices.Marshal.SizeOf()? Под объектом Marshal есть много интересных статических функций, которые могут быть здесь полезны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...