Тестирование экстремальных состояний памяти: как насытить оперативную память? - PullRequest
12 голосов
/ 31 января 2012

Я хотел бы написать небольшую часть программы, которая запускает потоки, линейно потребляет доступную оперативную память до определенного уровня и останавливается (в идеале, делает паузу до освобождения «достаточного количества» памяти и продолжает создавать потоки после этогои т. д.)

Я попробовал следующее, но list.Add(new byte[]) требует непрерывного пространства ОЗУ и отбрасывает OutOfMemoryException , что НЕ то, что я пытаюсь смоделировать.

РЕДАКТИРОВАТЬ:
У меня есть многопоточное приложение, требующее памяти, которое съедает целую кучу ОЗУ ГБ.Все, что я хочу, - это изолировать / воспроизвести эту ситуацию в «лабораторных условиях» для ее решения, т.е. написать черновой вариант адаптивного mem-мониторинга / ограничителя потока.Я использую x64 OS x64 Platform.Чтобы было понятно: результат, который я хочу видеть, - это то, что монитор памяти диспетчера задач поднимается прямо из-за программы.

    static void Main(string[] args)
    {            
        ComputerInfo ci = new ComputerInfo();
        D("TOTAL PHYSICAL MEMORY : " + Math.Round(ci.TotalPhysicalMemory / Math.Pow(10,9),3) +" GB");

        //########### Fill Memory ###############
        var list = new List<byte[]>();

        Thread FillMem= new Thread(delegate()
        {
            while (Process.GetCurrentProcess().PrivateMemorySize64 < MAX_MEM_LEVEL)
            {
                list.Add(new byte[1024 * 10000]); //<- I Need to change this
                Thread.Sleep(100); 
            }
        });

        FillMem.Start();

        //########### Show used Memory ###############
        Thread MonitorMem = new Thread(delegate()
        {
            while (true)
            {
                D("PROCESS MEMORY : " + Math.Round(Process.GetCurrentProcess().PrivateMemorySize64 / Math.Pow(10, 6), 3) + " MB");
                Thread.Sleep(1000);
            }
        });

        MonitorMem.Start();

        Console.Read();
    }

Ответы [ 3 ]

7 голосов
/ 31 января 2012

Вопрос все еще довольно запутанный;мне не ясно, что вы пытаетесь сделать здесь и почему.

Если вы действительно хотите потреблять физической памяти - то есть операционная система нетдействительно, не используйте эту часть физического чипа ОЗУ, установленного в машине, ни для чего, кроме того, что я говорю - тогда я бы, вероятно, использовал бы метко названную AllocateUserPhysicalPages функцию из неуправляемого кода.

Это уменьшит объем физической памяти, доступной для других целей, заставив больше виртуальных страниц памяти перейти в файл подкачки.

Кромеделая все программы, работающие на вашей машине, намного медленнее, я не уверен, что вы намерены достичь этим.Вы можете уточнить?

1 голос
/ 31 января 2012

Дело в том, что с C# вы не можете увеличить больше чем приблизительно 1.2 GB ОЗУ на 32-битной платформе .NET.Вы можете иметь даже 8 ГБ ОЗУ на 64-битной машине, но если процесс, который вы запускаете, был скомпилирован для 32-битной архитектуры, он приведет к OutOfMemoryException, как только он достигнет приблизительно 1,2 ГБ.

Для этого вида тестирования я бы предложил выбрать другой тип языков / каркасов.

РЕДАКТИРОВАТЬ

Хорошая ссылка на тему:

есть-есть-а-памяти предел-к-а-одной-нетто-процесса

0 голосов
/ 31 января 2012

Если проблема, с которой вы сталкиваетесь, заключается в том, что вашему процессу не хватает места в виртуальной памяти до того, как аппаратному обеспечению не хватает места в физической памяти, то вы можете просто ускорить обработку чисел (5, может быть?) Вашим кодом. (и что-то, чтобы остановить их, скажем, 1-2 ГБ, чтобы они сами не OOM). Вероятно, это не настолько хорошее решение, как неуправляемый вызов для выделения памяти, но сделать это будет достаточно просто.

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