Helpers - компьютеры, интернет, программирование

Как освободить виртуальную машину / частные байты настольного приложения на c #

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

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

20.05.2010

  • Вы имеете в виду, помимо того, что вообще не выделяли так много? Какое использование памяти вы все равно наблюдаете? 20.05.2010
  • Хороший вопрос. Управление / использование памяти в средах со сборкой мусора (например, Java и .Net) всегда меня немного пугает. Я всегда опасаюсь, что они в конечном итоге займут больше памяти, чем C ++, где вы полностью контролируете свою память, но я не уверен в этом на 100%. Существуют ли исследования, в которых сравнивается потребление памяти в средах с GC и без GC? 20.05.2010
  • @Patrick Я нашел ссылку, о которой говорил. Я даже не собираюсь делать вид, что понимаю все это, но вот оно: msdn .microsoft.com / en-us / magazine / bb985010.aspx 20.05.2010
  • @Codeka, Изначально при запуске моего приложения размер ВМ например 78 435К. Предположим, что если я хочу добавить водяной знак в файл pdf, который содержит более 10 000 страниц, а точнее 10776 страниц, размер виртуальной машины увеличивается, а иногда приложение зависает или выдает исключение из памяти. 20.05.2010
  • @Josh, спасибо за ссылку. Я прочитаю позже (когда у меня будет свободное время). 20.05.2010

Ответы:


1

Environment.FailFast :)

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

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

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

20.05.2010
  • В самом деле, именно по этой причине я никогда не доверяю диспетчеру задач, но всегда использую Sysinternal Process Explorer, где вы можете явно видеть частные байты и размер виртуальной машины. 20.05.2010
  • Совершенно верно, личные байты - это гораздо более значимое число. 20.05.2010
  • Мое приложение зависает и иногда выдает исключение из памяти. 20.05.2010
  • Да, тогда вам нужно будет профилировать, чтобы узнать, куда уходит вся память. Если вы начнете исчерпывать свободное непрерывное адресное пространство, вы столкнетесь с ошибками из-за нехватки памяти. Наиболее частыми виновниками являются большие массивы и строки, но вы можете просто потерять много ссылок на более мелкие объекты. (Или, возможно, вы могли бы проигнорировать проблему и перейти на 64-битную ОС.) 20.05.2010
  • @Patrick: Начиная с Vista, диспетчер задач будет показывать частные байты вместо размера виртуальной машины (как в Win XP). 20.05.2010

  • 2

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

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

    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();
    

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

    20.05.2010
  • Мое приложение зависает и иногда выдает исключение из памяти 20.05.2010
  • Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

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

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..