C #: использование памяти объекта - PullRequest
5 голосов
/ 17 февраля 2009

Есть ли способ узнать, сколько памяти используется для конкретного объекта? Например, список. Принимая все во внимание, как интернирование строк и все, что делается компилятором / средой выполнения / чем угодно.

Ответы [ 4 ]

5 голосов
/ 17 февраля 2009

ANTS Memory Profiler профилирует потребление памяти .NET-кодом. В прошлом у меня были отличные результаты.

2 голосов
/ 17 февраля 2009

Вам действительно нужно было бы точно определить , что вы имели в виду под «сколько памяти используется для определенного объекта». Например, вы могли бы иметь в виду «если этот объект был собран мусором, сколько будет освобождено» - или вы могли бы иметь в виду «сколько памяти занимает этот объект и все, к чему он прикасается».

Ваш пример о интернировании строк является хорошим примером. Предположим, вы делаете:

List<string> internedStrings = new List<string>();
List<string> nonInternedStrings = new List<string>();
for (int i=0; i < 1000; i++)
{
    string tmp = new string(' ', i+1);
    nonInternedStrings.Add(tmp);
    tmp = tmp.Intern();
    internedStrings.Add(tmp);
}

Действительно ли nonInternedStrings занимает больше памяти, чем internedStrings? Если бы internedStrings был собран мусором, он не освободил бы столько памяти - но если бы internedStrings никогда не был создан (включая не интернирование каждого из его элементов), тогда больше памяти никогда бы не потребовалось.

Если вы можете более конкретно указать точно , что вы имеете в виду, мы можем вам помочь. Хотя это сложная проблема.

2 голосов
/ 17 февраля 2009

Похоже, что этот вопрос Delphi . Наивный алгоритм не будет учитывать разницу между агрегацией и композицией. Даже алгоритм, основанный на метках и развертках, не скажет вам, должна ли хеш-таблица увеличивать свой внутренний массив, потому что он ссылался на объект. Возможно, вам лучше профилировать ваше приложение для различных сценариев и построить график использования ресурсов в зависимости от N, где N - это некоторая мера масштаба вашего набора данных.

1 голос
/ 17 февраля 2009

Вы пробовали CLR Profiler 2.0?

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