C #: использовать почти всю память - PullRequest
3 голосов
/ 16 декабря 2009

Моя цель - достичь точки, где я заполнил всю доступную память (обратите внимание, что я хочу делать это постепенно, поэтому до моего последнего выделения у меня осталось минимальное количество памяти). Как я могу это сделать?

Ответы [ 8 ]

9 голосов
/ 16 декабря 2009
for (object[] o = null;; o = new[] { o });
4 голосов
/ 16 декабря 2009

Один из вариантов - создать какой-то список и просто добавлять к нему ненужный список в бесконечном цикле.

Однако, в зависимости от необходимой точности, это может занять некоторое время - одним из способов его ускорения будет первоначальное добавление больших структур к элементам списка, затем перехват OutOfMemoryError и повторная попытка с более мелкими элементами, пока вы не получите Точность вам нужна.

2 голосов
/ 16 декабря 2009
var junk = new LinkedList<byte[]>();
int allocSize = 100 * 1024 * 1024; // 100 MiB
while (allocSize > 0)
{
    try
    {
        junk.AddLast(null);
        junk.Last.Value = new byte[allocSize];
    }
    catch (OutOfMemoryException)
    {
        allocSize = (allocSize - 1) / 2;
    }
}
1 голос
/ 16 декабря 2009

Сценарий, о котором вы говорите, звучит так, как если бы вы тестировали приложение.

Возможно, вы захотите изучить инструменты нагрузочного / стресс-тестирования. LoadRunner - первое, что приходит на ум. Это не "в C #", и я уверен, что это не бесплатно, но это может быть правильный инструмент для работы. Кроме того, вы можете захотеть взглянуть на внедрение ошибок, если вам нужно только увидеть, как ваша программа обрабатывает исключение OutOfMemory.

Точно о чем вы спрашивали, вот статья с приложением, которое использует RAM: http://msdn.microsoft.com/en-us/magazine/cc163613.aspx

0 голосов
/ 16 декабря 2009
        int size = 1024;
        var bytes = new List<byte[]>();
        while (true)
        {
            try
            {
                bytes.Add(new byte[size]);
            }
            catch
            {                   
                if (size == 1)
                {
                    throw;
                }
                size = size / 2;
            }
        }
0 голосов
/ 16 декабря 2009

Путь LINQ:

Enumerable.Range(0, int.MaxValue).ToArray();
0 голосов
/ 16 декабря 2009

Продолжайте добавлять большой буфер в поток памяти внутри цикла while.

0 голосов
/ 16 декабря 2009

Может как то так?

var bytes = new List<byte[]>();
var time = new TimeSpan(100);
while (true)
{
    bytes.Add(new byte[1024]);
    Thread.Sleep(time);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...