Как освободить виртуальные / личные байты настольного приложения в c # - PullRequest
3 голосов
/ 20 мая 2010

У меня есть настольное приложение, разработанное на C #. Размер виртуальной машины, используемый приложением, очень высок. Я хочу добавить водяной знак в PDF-файл, который содержит более 10000 страниц, а точнее 10776 страниц, размер виртуальной машины увеличивается, и иногда приложение зависает или выбрасывается из памяти.

Есть ли решение для программного освобождения / уменьшения размера виртуальной машины в C #

Ответы [ 2 ]

2 голосов
/ 20 мая 2010

Environment.FailFast:)

На самом деле, большой размер виртуальной машины не обязательно указывает на проблему с памятью. Я всегда смущаюсь, когда речь заходит о различных показателях памяти, но я считаю, что размер виртуальной машины - это мера количества используемого адресного пространства, не обязательно используемого физической памяти.

Вот еще один пост на эту тему: Что означает «Размер виртуальной машины» в диспетчере задач Windows?

Если вы подозреваете, что у вас есть проблемы с использованием памяти в вашем приложении, вам, вероятно, нужно подумать об использовании профилировщика памяти, чтобы найти основную причину (каламбур). Сначала немного сложно привыкнуть, но ценный навык. Вы будете удивлены, какие проблемы с производительностью возникают при профилировании.

1 голос
/ 20 мая 2010

Это сильно зависит от вашего исходного кода. С учетом предоставленной информации все, что я могу сказать, это то, что было бы лучше получить профилировщик памяти и проверить, есть ли место для оптимизации.

Просто чтобы продемонстрировать вам, как можно оптимизировать использование памяти, я хотел бы показать вам следующий пример . Вместо использования конкатенации строк, как это

string x = "";
for (int i=0; i < 100000; i++)
{
    x += "!";
}

использование StringBuilder намного более эффективно для памяти (и времени), так как не выделяет новую строку для каждой конкатенации:

StringBuilder builder = new StringBuilder();
for (int i=0; i < 100000; i++)
{
    builder.Append("!");
}
string x = builder.ToString();

Конкатенация в первом примере создает новый строковый объект на каждой итерации, который занимает дополнительную память, которая будет очищаться только во время работы сборщика мусора.

...