Частные байты >> Рабочий набор нормальный? - PullRequest
2 голосов
/ 17 июня 2010

ОК, это может звучать странно, но это так.

Есть 2 компьютера, A (Pentium D) и B (Quad Core) с почти одинаковым объемом оперативной памяти под управлением Windows XP.

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

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

Может ли это быть проблемой с манифестами или DLL-файлами (системой)?Я невежественный .

Также , я скомпилировал исполняемый файл на A и запустил на B, и он работал.

Примечание:

Я наблюдал используемую память с Process Explorer .

Вопрос:

Во время выполнения (где у нас есть несколько выделений и освобождение) это нормально, если количество частных байтов намного больше (1,5 ГБ против 70 МБ), чем рабочий набор?

Ответы [ 4 ]

4 голосов
/ 17 июня 2010

Тот факт, что утечка памяти (увеличение личных байтов) не влияет на рабочий набор, неудивителен. Размер рабочего набора определяется количеством страниц памяти, к которым приложение обращалось в последнее время. Частные байты - это объем памяти, выделенный процессом (и не используемый другими процессами). Если приложение забывает освободить объекты, которые оно больше не использует (утечка памяти), то его частные байты не уменьшатся, а рабочий набор будет, потому что он не использует эту память активно. См. http://technet.microsoft.com/en-us/library/cc780836.aspx для получения подробной информации о типах статистики ресурсов, которые Windows может отслеживать для процесса.

Возможно, вы захотите посмотреть версии библиотек DLL, загруженных приложением на каждой машине - возможно, на машине должен быть установлен патч или пакет обновления с утечкой памяти, чтобы решить эту проблему. Process Explorer также может отображать сведения о библиотеках DLL, загруженных в процесс.

4 голосов
/ 17 июня 2010

Виртуальное адресное пространство, частные байты и рабочий набор - это 3 совершенно разных аспекта вашего приложения.

  • Private Bytes - это память, используемая в данный момент вашим приложением.
  • Рабочий набор - это часть памяти, которая в данный момент загружена в ОЗУ. Остальное заменяется в файле подкачки.
  • Виртуальное адресное пространство - это самый высокий адрес памяти, который когда-либо использовался вашим приложением. Фрагментация может привести к тому, что виртуальное адресное пространство будет намного больше, чем частные байты.

Типичное заблуждение состоит в том, что ограничение для частных байтов составляет 2 ГБ (для 32-разрядных приложений, не поддерживающих большие адреса). 2 ГБ - фактически предел для виртуального адресного пространства. Фрагментация приводит к тому, что ограничение для частных байтов будет меньше. Сколько это зависит, зависит от приложения. В моем приложении у меня начинаются проблемы с 1.7-1.8 ГБ.

Более подробное объяснение см. http://shsc.info/WindowsMemoryManagement.

Теперь это все еще не объясняет разницу между вашими двумя компьютерами. Достаточно трудно понять, какова истинная причина этого различия, но это может помочь взглянуть на «аспекты», в которых они различаются, и первое, что я вижу, это количество процессоров / ядер. Использует ли ваше приложение многопоточность? Может ли быть проблема синхронизации между вашими потоками, которая появляется только в четырехъядерной системе?

0 голосов
/ 17 июня 2010

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

0 голосов
/ 17 июня 2010

Утечки памяти могут быть непредсказуемыми и их трудно определить. Так как у вас есть IDE на компьютере с утечкой памяти, и вы можете отлаживать процесс, объем памяти которого увеличивается, традиционные методы отладки для плохого процесса были бы моим единственным предложением. Вы не можете использовать valgrind, так как вы не используете * nix, но, возможно, вам стоит взглянуть на Есть ли хороший заменитель Valgrind для Windows? .

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