Почему зарезервированная виртуальная память растет, а используемая в настоящее время виртуальная память не растет? - PullRequest
1 голос
/ 15 июля 2011

Мое приложение получает исключение bad_alloc.Монитор ресурсов показывает, что виртуальная память, зарезервированная ОС (Commit), превысила 2G.Однако виртуальная память, используемая в настоящее время процессом (рабочий набор), довольно мала (во время сбоя она может составлять около 200000 КБ).Как это может случиться?Я заметил, что при запуске программы эти два имеют почти одинаковый размер (Commit немного больше).Но с течением времени разница увеличивается, и мне кажется, что, когда увеличивается вторая память (рабочий набор), увеличивается и первая (коммит).Но когда второй уменьшается, первый не возвращается.Я использую три разных компьютера и везде такое поведение.Я использую Windows 7, и программа написана на C ++.

Что может вызвать такое поведение?Спасибо

Ответы [ 2 ]

1 голос
/ 15 июля 2011

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

0 голосов
/ 15 июля 2011

«Рабочий набор» - это количество страниц, которые ОС делает видимыми для вашего приложения. ОС все время пытается уменьшить его.

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

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