2009-08-25 3 views
0

Мой код:RAM проблемы PerformanceCounter

var list = new LinkedList<int>(); 
var ramCounter = new PerformanceCounter("Memory", "Available MBytes"); 
while (true) 
{ 
    for(int i = 0; i < 1000 * 1000; i++) list.AddLast(0); 
    Console.WriteLine(ramCounter.NextValue()); 
} 

Вопросы:

  1. документация, кажется, сказать, что я могу использовать PerformanceCounter только как Administrator, но я побежал мое заявление как Standard Пользователь и он сработал. Могу ли я на это положиться?
  2. Я постоянно получаю OutOfMemoryException когда около 200 МБ ОЗУ остаются, почему? Это невозможно из-за фрагментации, потому что я выделяю int за раз. Кроме того, это не может быть из-за проблем с адресацией, так как я уже превысил 2 ГБ (исключение получает, когда из моего 3 ГБ извлекается 2.8). Номера, выводимые тестовым приложением, были проверены с помощью окна «Диспетчер задач», расположенного сбоку.
  3. Как только я получил BSOD, когда тестовое приложение было запущено и осталось около 400 МБ. Какие-нибудь намеки на то, что может это сделать? Я проведу проверку целостности ОЗУ, что-нибудь еще? Должен ли я быть осторожным с вызовом PerformanceCounter.NextValue() в цикле или что-то в этом роде? Обратите внимание: это первый раз, когда я получаю BSOD на этом ПК.
  4. В некоторых случаях при выполнении программы я получаю большие задержки. Например. когда я начинаю с 1 ГБ свободной оперативной памяти, когда я добираюсь до 700 МБ, приложение замораживается в течение 1 секунды, а затем примерно в 400 МБ замерзает около 4 секунд. Почему это? Потому что ОС необходимо поменять местами кэширование диска, чтобы освободить память или что-то еще?

Примечание: Почему я это делаю? Ну, я хочу, чтобы мое приложение, интенсивно использующее память, обнаруживало, когда осталось 5 МБ ОЗУ, и предупреждайте пользователя о том, что «Память низкая, пожалуйста, закройте другие программы и вернитесь, или эта программа не удастся».

+0

Если у вас нет ссылки на резервные копии утверждений о том, что они не могут быть проблемами фрагментации или адресности, вы не должны исключать их. – Amok

+1

Зачем ты создал эту вики? –

+0

Amuck: ну, независимо от того, насколько сильно фрагментирована память, всегда найдется место для одного int (или пара, в котором учитываются служебные данные LinkedList). Также я не вижу, как это может быть связано с адресацией, учитывая, что моя 32-битная Windows может адресовать память до 4 ГБ, и я работаю ниже трех. –

ответ

0

Я не могу решить все ваши вопросы, но здесь идет

2) Вы на 32 или 64 битной Windows? Похоже, что вы используете большой адресный процесс с доступом к 3 ГБ (т. Е. На 32-битной Windows). В любом случае вы должны иметь в виду, что память выделяется в патронах разных размеров, и использование кучи не является единственным источником. Сам CLR имеет множество структур, каждый поток имеет стек и так далее. В любом случае вы не можете рассчитывать на то, что сможете использовать точно 3 ГБ,

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

4) Если вы используете большую память, GC будет нелегко продолжать. Поскольку пользовательские потоки приостанавливаются, пока выполняются определенные части GC, это значительно замедлит ваше приложение.

+0

Я использую 32-битную Windows - не могли бы вы объяснить, как это может быть проблемой? Я не получил объяснений. Кроме того, даже если я не могу рассчитывать на то, что смогу использовать ровно 3 ГБ, я могу ожидать, что PerformanceCounter вернется почти нулевым, когда у меня не хватает памяти, верно? Что касается GC, я предполагаю, что это правильно, но немного похудеть, чтобы GC съел огромное время обработки по небольшой причине. –

+0

Распределение памяти - сложный вопрос. Я рекомендую вам взглянуть на серию Марка Руссиновича по этому вопросу на http://blogs.technet.com/markrussinovich/archive/2008/07/21/3092070.aspx, поскольку это не является предметом обсуждения в комментариях , –

+0

GC работает, потому что вы используете и поддерживаете большую память. Так работает GC. Поскольку он переупорядочивает память, он должен приостанавливать пользовательские потоки, чтобы избежать компрометации состояния. –

Смежные вопросы