Еще один вопрос утечки памяти - PullRequest
0 голосов
/ 30 мая 2010

Мое приложение продолжает работать в течение 4–6 часов. В течение этого времени не происходит постепенного увеличения памяти или чего-либо подобного.

Затем через 4-6 часов я начинаю получать исключения EOutofMemory. Даже в то время в соответствии с диспетчером задач используется только 900 МБ из 3 ГБ ОЗУ. И само приложение не использует более 200 МБ.

Тогда почему я получаю ошибку EOoutofMEmory?

Означает ли это, что утечка памяти не обязательно видна в диспетчере задач?

Regagards

Ответы [ 2 ]

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

Используйте Process Explorer вместо диспетчера задач, чтобы посмотреть потребление памяти вашим приложением.

  • Private Bytes: объем памяти, используемый вашим приложением. Это также значение, отображаемое диспетчером задач в столбце Размер виртуальной машины (под XP)
  • Размер виртуальной памяти: это самый большой адрес, который в настоящее время используется вашим приложением. Это значение ограничено 2 ГБ (для 32-разрядных приложений в 32-разрядных ОС).

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

Менеджер памяти DougLea является бесплатной альтернативой. Также есть коммерческий менеджер памяти. Вы также можете попробовать написать свой собственный менеджер памяти (это не так сложно: вам нужно только переопределить операторы new и delete).

Есть также хитрости по увеличению лимита до 2 ГБ. Если вы свяжете свое приложение с флагом / LARGEADDRESSAWARE, ваше приложение сможет выделить 3 ГБ памяти (если XP загружается с флагом / 3GB, для Vista / W7, вероятно, есть аналогичный флаг, но я этого не знаю). В 64-разрядных операционных системах исполняемый файл LargeAddressAware может использовать до 4 ГБ памяти.

0 голосов
/ 30 мая 2010

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

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

Я предлагаю вам проверить размер распределения, которое не удалось.

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