.Net Why разве я не могу получить больше чем 11 ГБ выделенной памяти в процессе x64?

Я думал, что максимальное пространство пользователя для процесса на 64 бита составляло 8 ТБ, но я действительно немного тестировал, и максимум, который я мог получить, 10-11GB.

Примечание: Мне не нужно так много памяти в процессе, я просто хочу понять почему из любопытства.

Вот моя тестовая программа:

static void Main(string[] args)
{
    List<byte[]> list = new List<byte[]>();

    while (true)
    {
        Console.WriteLine("Press any key to allocate 1 more GB");
        Console.ReadKey(true);
        list.Add(new byte[1024 * 1024 * 1024]);

        Console.WriteLine("Memory size:");
        double memoryUsage = Process.GetCurrentProcess().PeakVirtualMemorySize64 / (double)(1024 * 1024 * 1024);
        Console.WriteLine(memoryUsage.ToString("0.00") + " GB");
        Console.WriteLine();
    }
}

Править:

Обновленный тестовая программа, чтобы быть более детерминированным.

Для принятия ответа, я хотел бы знать, как реальная максимальная выделенная память вычисляется, если 8 ТБ только теоретические.

16
задан Jeff Cyr 12 January 2010 в 20:34
поделиться

4 ответа

Это до 8 ТБ, а не 8 тб. Вы можете потенциально иметь до 8 туберкулезом, но вам нужна соответствующая RAM / Swapfile.

5
ответ дан 30 November 2019 в 22:49
поделиться

Я предполагаю, что вы используете список, который, по которому я считаю, имеет внутренний предел.

Посмотрите, что вы можете получить, если вы попробуете что-то вроде создания собственного списка старого школы:

public class ListItem<T>
{
    public ListItem Parent;
    public T Value;

    public ListItem(ListItem<T> parent, T item)
    {
        this.Parent = parent;
        this.Value = item;
    }
}

Я написал почти этот точный код до (только мой предмет был int) и запустить его на машине с 32 процессорами и 128 ГБ ОЗУ, она всегда переплетается по тому же размеру, несмотря ни на что, и всегда было что-то связанное с Int32.maxValue, надеюсь, что поможет.

1
ответ дан 30 November 2019 в 22:49
поделиться

Это ваша машина.

У меня есть X64 с 8 ГБ оперативной памяти и страниц 12 ГБ, и я провел вашу программу, и он вышел на 16,23 ГБ.

EPILOG : Тогда моя Win7 устанавливает постепенно скользнув в коме, поскольку критические процессы были видимо, по-видимому, воспоминания.

Отредактируйте : Если вы хотите понять, как выделены Windows (то есть резервы и коммиты), прочитайте , нажав пределы Windows: физическая память и Нажатие пределов Windows: Virtual Память .

Поскольку .NET опирается на Windows, чтобы управлять памятью, которую он использует для создания кучи GC, механику того, как окна отражены в том, как память выделяется в .NET на низком уровне.

8
ответ дан 30 November 2019 в 22:49
поделиться

Попробуйте выделить один блок (в отличие от списка 1МБ блоков):

Dim p As IntPtr = System.Runtime.InteropServices.Marshal.AllocHGlobal(New System.IntPtr(24 * (1024 ^ 3)))

Правка - Учитывая ваш комментарий, что у вас всего 4 ГБ физической оперативной памяти, у вас действительно нет бизнес выделения > ~ 8ГБ, и даже это нажимает на него.

Edit -

Чтобы принять ответ, я хотел бы знать, как вычисляется реальный максимальный объем выделяемой памяти, если 8 ТБ - это только теоретические данные.

Максимальный объем выделяемой оперативной памяти, вероятно, эквивалентен (Page File Size - Размеры всего в оперативной памяти , за исключением того, что не может или не будет выводиться на страницу) + (Physical RAM Size - Размер всего, что не может или не будет выводиться на страницу, т.е. того, что необходимо для поддержания работы вашей системы... ядра, драйверов, .net вещей и т.д...)

Конечно же, файл страницы может расти.....

Рано или поздно страниц на диск или с диска становится очень много, и ваша система замедляется до ползучести и становится непригодной для использования.

Читайте блог Марка Руссиновича:

1
ответ дан 30 November 2019 в 22:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: