Размеры процессов и различия в поведении в 32-битных и 64-битных версиях Windows - PullRequest
3 голосов
/ 28 января 2010

Я исследую странную проблему с моим приложением, где поведение отличается в 2 версиях Windows:

  • Windows XP (32-разрядная версия)
  • Windows Server 2008 (64-разрядная версия)

Мои выводы следующие.

Windows XP (32-разрядная версия)

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

Во время сбоя размер процесса составляет приблизительно 2,3 ГБ. Обратите внимание, что раздел реестра был установлен, чтобы позволить процессу превышать максимальный размер процесса по умолчанию 2 ГБ (в 32-разрядных операционных системах).

Системой сбоя является вызов IXMLDOMDocument::load() сбоя, как описано в вопросе, связанном выше.

Windows Server 2008 (64-разрядная версия)

Я запускаю точно в том же тестовом сценарии в Windows Server 2008 - единственной переменной является операционная система. Когда я смотрю на мой процесс в диспетчере задач, рядом с ним стоит * 32, что, как я предполагаю, означает, что он работает в режиме 32-битной совместимости.

Что я заметил, так это то, что в момент сбоя синтаксического анализа XML в Windows XP размер процесса в Windows Server 2008 составляет всего около 1 ГБ (IOW, примерно вдвое меньше, чем в Windows XP).

Синтаксический анализ XML не завершается с ошибкой в ​​Windows Server 2008, все работает как надо.

Мои вопросы:

  1. Почему 32-разрядное приложение (работающее в 32-разрядном режиме) потребляет половину объема памяти в 64-разрядной операционной системе? Это действительно использует половину памяти, это обычная виртуальная память по-другому, или это что-то еще?

  2. Признавая, что мое приложение (кажется) использует половину объема памяти в Windows Server 2008, у кого-нибудь есть какие-либо идеи относительно того, почему синтаксический анализ XML не будет работать в Windows XP? Каждый раз, когда я запускаю тестовый пример, ошибка, доступ к которой осуществляется через IXMLDOMParseError (см. этот ответ ), отличается. Поскольку это кажется недетерминированным, мне кажется, что я сталкиваюсь с проблемой использования памяти, а не с искаженным XML.

Ответы [ 2 ]

1 голос
/ 28 января 2010

Вы не сказали, как вы наблюдали за процессом. Я предполагаю, что вы использовали Taskmgr.exe. Помните, что это представление по умолчанию дает очень вводящие в заблуждение значения в столбце Память. Он показывает размер рабочего набора, объем оперативной памяти, используемой процессом. Это не имеет никакого отношения к источнику вашей проблемы, нехватке виртуальной памяти. Нет особых оснований предполагать, что Windows 2008 будет показывать то же значение, что и XP, у нее значительно отличается диспетчер памяти.

Вы также можете видеть размер виртуальной памяти, используйте View + Columns.

Причина, по которой ваша программа не выполняет бомбардировку в 64-разрядной операционной системе, заключается в том, что 32-разрядные процессы имеют почти 4 гигабайта адресуемой виртуальной памяти. В 32-разрядной операционной системе требуется разделить адресное пространство с операционной системой и получить только 2 гигабайта. Больше, если вы используете параметр загрузки / 3GB.

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

0 голосов
/ 31 марта 2010

Существуют не только различия в доступной памяти между 32-битной и 64-битной (как обсуждалось в предыдущих ответах), но и наличие непрерывной памяти, которая может убить ваше приложение на 32-битной.

На 32-битной машине библиотеки DLL вашего приложения будут засорять область памяти в первых 2 ГБ памяти (приложение в 0x00400000, операционные библиотеки DLL в 0x7xxx0000, другие DLL в других местах). Скорее всего, самый большой непрерывный блок, который у вас есть, составляет около 1,1 ГБ.

На 64-битном компьютере (который дает вам адресное пространство 4 ГБ с / LARGEADDRESSAWARE) у вас будет хотя бы один блок в этом пространстве 4 ГБ, размер которого составляет 2 ГБ или более.

Итак, в этом ваша разница. Если ваш синтаксический анализатор XML использует большой двоичный объект памяти, а не множество маленьких двоичных объектов, возможно, ваш синтаксический анализатор XML исчерпал непрерывное используемое пространство на 32-разрядной, но не исчерпал непрерывное полезное пространство на 64-разрядной.

Если вы хотите визуализировать это в 32-битной ОС, возьмите копию VMValidator (бесплатно) и посмотрите на виртуальное представление для визуализации вашей памяти и представлений страниц и абзацев, чтобы увидеть данные для каждой страницы памяти / абзаца.

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