Максимальный объем памяти в x86 .NET app под x64 OS
От: ASolovey Россия  
Дата: 20.06.08 18:24
Оценка:
Коллеги,
хелпните plz.

Столкнулись с таким глюком.
Есть .NET 2.0 x86 приложение собранное с флагом "Large Address Aware".
Делает простую вещь (в данном случае для теста) — аллоцирует массивы byte[] по несколько Kb, и сует их в Dictionary.
Задача — использовать как можно больше памяти. (понятное дело — это не самоцель )

Под x86 OS с опцией boot.ini /3GB оно совершенно спокойно использует до 3Gb памяти. Т.е. все работает как заявлено в доке.

А вот под x64 OS (Т.е. в режиме совместимости) оно согласно документации должно уметь использовать до 4Gb.
Однако уже на 2Gb оно умирает. Начинается своп. Операции с Dictionary резко тормозятся до невозможности — любая операция занимает несколько минут или даже десятков минут. В общем — кирдык.

Проверялось и на WinXPx64 и на W2003SRVx64.
На машине с 3Gb RAM и на машине с 6Gb RAM.
Эффект одинаков. На 2Gb все заканчивается.

Возникает резонный вопрос — какого собственно?
Есть какие-нибудь идеи, или мысли — куда копать?
Re: Максимальный объем памяти в x86 .NET app под x64 OS
От: TK Лес кывт.рф
Дата: 20.06.08 19:20
Оценка:
Здравствуйте, ASolovey, Вы писали:

AS>А вот под x64 OS (Т.е. в режиме совместимости) оно согласно документации должно уметь использовать до 4Gb.

AS>Однако уже на 2Gb оно умирает. Начинается своп. Операции с Dictionary резко тормозятся до невозможности — любая операция занимает несколько минут или даже десятков минут. В общем — кирдык.

AS>Возникает резонный вопрос — какого собственно?

AS>Есть какие-нибудь идеи, или мысли — куда копать?

Копайте в Performance Counters. Чем именно занимается процессор во время тормозов и т.п
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Максимальный объем памяти в x86 .NET app под x64 OS
От: arkhivania  
Дата: 21.06.08 18:23
Оценка:
Здравствуйте, ASolovey.
Как минимум поможет вам профайлер. Однако если сюда заглянут профи, хотел бы рассказать свою проблему и тоже с памятью.
Условия такие ... виста с 3 гигами памяти (причем у меня такое ощущение что своп с такой конфигурацией виста вообще не использует) нормальное такое приложение (я бы сказал огромное) с кучей всяких механизмов кэширования памяти при помощи слабых ссылок и так далее. Большинство уязвимых мест утечки памяти ликвидировано при помощи терпеливой работе с профайлером Jet Brains (правда нужно отметить, что реализация некоторых даже Windows Forms классов влекут за собой удивительные утечки памяти (ToolStrip, меню и FlowLayoutPanel) или как в соседней ветке Remoting тоже забавно глючит). Ну в общем дело в том, что приложение вылетает на 1.5 гигах памяти (это ситуация не критична, так как в реальности программа берет около 400мб, а здесь эксперименты ставлю). Вылетает приложение с System.OutOfMemoryException, причем в моменты когда особенно ничего большого не выделяется. Вот такие приколы. Хотя я вот как-то внутри лично уверен, что если бы памяти был гиг и работал своп всё бы тормозило, но не вылетало. Вариант с фрагментацией памяти не подходит, так как куски памяти более 5-10 мегабайт не выделяются и то в редких случаях (приложение работает с медицинскими изображениями). В общем если будут варианты шо это может быть с радостью узнаю
Re: Максимальный объем памяти в x86 .NET app под x64 OS
От: fdn721  
Дата: 23.06.08 03:31
Оценка:
Здравствуйте, ASolovey, Вы писали:

AS>Коллеги,

AS>хелпните plz.

AS>Столкнулись с таким глюком.

AS>Есть .NET 2.0 x86 приложение собранное с флагом "Large Address Aware".
AS>Делает простую вещь (в данном случае для теста) — аллоцирует массивы byte[] по несколько Kb, и сует их в Dictionary.
AS>Задача — использовать как можно больше памяти. (понятное дело — это не самоцель )

AS>Под x86 OS с опцией boot.ini /3GB оно совершенно спокойно использует до 3Gb памяти. Т.е. все работает как заявлено в доке.


AS>А вот под x64 OS (Т.е. в режиме совместимости) оно согласно документации должно уметь использовать до 4Gb.

AS>Однако уже на 2Gb оно умирает. Начинается своп. Операции с Dictionary резко тормозятся до невозможности — любая операция занимает несколько минут или даже десятков минут. В общем — кирдык.

AS>Проверялось и на WinXPx64 и на W2003SRVx64.

AS>На машине с 3Gb RAM и на машине с 6Gb RAM.
AS>Эффект одинаков. На 2Gb все заканчивается.

AS>Возникает резонный вопрос — какого собственно?

AS>Есть какие-нибудь идеи, или мысли — куда копать?



А сам .NET 2.0 x86 собран с флагом Large Address Aware под Windows x64???

Я так подозркваю что нет. Потому и не видит больше 2Gb. Используй .Net x64
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.