Коллеги,
хелпните 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 все заканчивается.
Возникает резонный вопрос — какого собственно?
Есть какие-нибудь идеи, или мысли — куда копать?
Здравствуйте, ASolovey, Вы писали:
AS>А вот под x64 OS (Т.е. в режиме совместимости) оно согласно документации должно уметь использовать до 4Gb.
AS>Однако уже на 2Gb оно умирает. Начинается своп. Операции с Dictionary резко тормозятся до невозможности — любая операция занимает несколько минут или даже десятков минут. В общем — кирдык.
AS>Возникает резонный вопрос — какого собственно?
AS>Есть какие-нибудь идеи, или мысли — куда копать?
Копайте в Performance Counters. Чем именно занимается процессор во время тормозов и т.п
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, ASolovey.
Как минимум поможет вам профайлер. Однако если сюда заглянут профи, хотел бы рассказать свою проблему
и тоже с памятью.
Условия такие ... виста с 3 гигами памяти (причем у меня такое ощущение что своп с такой конфигурацией виста вообще не использует) нормальное такое приложение (я бы сказал огромное) с кучей всяких механизмов кэширования памяти при помощи слабых ссылок и так далее. Большинство уязвимых мест утечки памяти ликвидировано при помощи терпеливой работе с профайлером Jet Brains
(правда нужно отметить, что реализация некоторых даже Windows Forms классов влекут за собой удивительные утечки памяти (ToolStrip, меню и FlowLayoutPanel) или как в соседней ветке Remoting тоже забавно глючит). Ну в общем дело в том, что приложение вылетает на 1.5 гигах памяти (это ситуация не критична, так как в реальности программа берет около 400мб, а здесь эксперименты ставлю). Вылетает приложение с System.OutOfMemoryException, причем в моменты когда особенно ничего большого не выделяется. Вот такие приколы. Хотя я вот как-то внутри лично уверен, что если бы памяти был гиг и работал своп всё бы тормозило, но не вылетало. Вариант с фрагментацией памяти не подходит, так как куски памяти более 5-10 мегабайт не выделяются и то в редких случаях (приложение работает с медицинскими изображениями). В общем если будут варианты шо это может быть с радостью узнаю
Здравствуйте, 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