Проблемы с RAM PerformanceCounter - PullRequest
1 голос
/ 25 августа 2009

Мой код:

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 только как Администратор , но я запустил свое приложение как Стандартный пользователь , и это сработало. Могу я на это положиться?
  2. Я последовательно получаю OutOfMemoryException , когда остается около 200 МБ ОЗУ, почему ? Это не может быть из-за фрагментации, потому что я выделяю int одновременно. Кроме того, это не может быть из-за проблем с адресуемостью, так как я уже превышаю 2 ГБ (исключение выдается, когда берут 2,8 из моих 3 ГБ). Числа, выведенные тестовым приложением, были проверены с помощью окна диспетчера задач, работающего сбоку.
  3. Однажды я получил BSOD, когда тестовое приложение работало и оставалось около 400 МБ. Любые намеки относительно того, что могло бы вызвать это? Я проверю целостность оперативной памяти, что-нибудь еще? Должен ли я быть осторожен с вызовом PerformanceCounter.NextValue() в цикле, или что-то? Обратите внимание, это первый раз, когда я получаю BSOD на этом ПК.
  4. В некоторые моменты выполнения программы возникают большие задержки. Например. когда я начинаю с 1 ГБ свободной оперативной памяти, когда я получаю 700 МБ, приложение зависает на 1 секунду, затем примерно на 400 МБ оно останавливается на 4 секунды. Почему это? Потому что ОС должна выгрузить дисковые кэши, чтобы освободить память, или что-то в этом роде?

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

1 Ответ

0 голосов
/ 25 августа 2009

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

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

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

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

...