что может быть причиной роста виртуальных байтов в 2 раза? - PullRequest
1 голос
/ 27 июля 2010

Виртуальные байты приложения увеличиваются в 2 раза по сравнению с частными байтами.

означает ли это утечку памяти?плохой дизайн приложения?

ОС 32Bit

любые мысли приветствуются.Приложение является потоковой базой данных.

Ответы [ 4 ]

3 голосов
/ 27 июля 2010

Виртуальные байты приложения увеличиваются в 2 раза по сравнению с частными байтами.

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

void *p = malloc( 16u<<20 );

потребляет 16 МБ виртуальной памяти. Но пока приложение не выполняет никаких действий с блоком памяти, ОС даже не будет пытаться отобразить виртуальную память в ОЗУ. Самый простой способ принудительного фактического выделения частной памяти - это memset () it:

void *p = malloc( 16u<<20 );
memset( p, 0, 16u<<20 );

означает ли это утечку памяти? плохой дизайн приложения?

Или оба. Или ни того, ни другого.

Более длинный вариант ответа: неизвестно, зависит от того, какое приложение памяти выделяет, какие другие ресурсы использует приложение, ОС, ч / б платформа и т. Д.

Если вы не уверены, используйте инструменты анализа утечки памяти, например, Valgrind . Прочтите SO для получения дополнительной информации о анализе утечек памяти в C ++ .

3 голосов
/ 27 июля 2010

Фрагментация.

Если вы выделите следующие фрагменты памяти:

  • 16KB
  • 8KB
  • 16KB

и затем вы освобождаете часть 8 КБ, ваше приложение будет иметь 32 КБ личных байтов, но 40 КБ байтов виртуальной памяти, что на самом деле является самым большим адресом виртуальной памяти, который когда-либо использовался вашим процессом (игнорируя другие части памяти ради простоты).

Рассмотрите (если возможно) использование другого менеджера памяти. Некоторые альтернативы:

  • Куча Windows с низким содержанием корма (подробнее см. http://msdn.microsoft.com/en-us/library/aa366750%28VS.85%29.aspx)
  • Менеджер памяти с открытым исходным кодом Doug-Lea
  • Коммерческие альтернативы, такие как Hoard

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

1 голос
/ 08 апреля 2012

Одна из возможностей - если вы установите большой резервный размер стека для ваших потоков с помощью опции компоновщика / STACK: reserve_bytes, а затем запускаете много потоков.

Например, если у вас есть служба ATL, она автоматически запускает 4 * numberOfCores многоквартирного сообщения по умолчанию. Скомпилируйте и свяжите такую ​​службу с / STACK: 12000000 (12 мегабайт), затем запустите ее на 16-ядерном сервере, и он запустит 64 потока, каждый со стеком 12 МБ, сразу же израсходовав 768 МБ виртуального адресного пространства, хотя фактическое выделенное память может быть намного ниже.

1 голос
/ 27 июля 2010

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

...