Моя память физическая 4G, но почему у меня не хватает памяти, даже если я создаю только 1,5G объект памяти. Есть идеи почему? (В то же время я видел, что во вкладке «Быстродействие» диспетчера задач память не заполнена полностью, и я также мог бы здесь напечатать - так что памяти на самом деле не мало, поэтому я думаю, что столкнулся с некоторыми другими ограничениями памяти)?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestBigMemoryv1
{
class MemoryHolderFoo
{
static Random seed = new Random();
public Int32 holder1;
public Int32 holder2;
public Int64 holder3;
public MemoryHolderFoo()
{
// prevent from optimized out
holder1 = (Int32)seed.NextDouble();
holder2 = (Int32)seed.NextDouble();
holder3 = (Int64)seed.NextDouble();
}
}
class Program
{
static int MemoryThreshold = 1500; //M
static void Main(string[] args)
{
int persize = 16;
int number = MemoryThreshold * 1000 * 1000/ persize;
MemoryHolderFoo[] pool = new MemoryHolderFoo[number];
for (int i = 0; i < number; i++)
{
pool[i] = new MemoryHolderFoo();
if (i % 10000 == 0)
{
Console.Write(".");
}
}
return;
}
}
}
В нормальном приложении Windows на 32 бита процесс только имеет 2 ГБ адресуемой памяти. Это не важно на сумму физической памяти, которая доступна.
Так доступные 2 ГБ, но 1.5 макс., которое можно выделить. Ключ - то, что Ваш код не является единственным кодом, работающим в процессе. Другие.5 ГБ являются, вероятно, CLR плюс фрагментация в процессе.
Обновление: в.Net 4.5 в процессе на 64 бита у Вас могут быть большие массивы, если установка gcAllowVeryLargeObjects включена:
На 64-разрядных платформах, включает массивы, которые больше, чем 2 гигабайта (ГБ) в общем размере. Максимальное число элементов в массиве является UInt32. MaxValue.
<configuration>
<runtime>
<gcAllowVeryLargeObjects enabled="true" />
</runtime>
</configuration>
На 32-разрядной операционной системе Windows максимальная память 'непривилегированного режима', к которой может получить доступ отдельное приложение, составляет 2 ГБ... предполагающих, что у Вас есть 4 ГБ памяти на поле.
Неуправляемый VC ++ Application' s потребление памяти на windows server
http://blogs.technet.com/markrussinovich/archive/2008/07/21/3092070.aspx
(Это забавно, Вы спросили это, потому что я спросил почти то же самое вчера...)
У Вас есть макс. из адресуемой памяти на 2 ГБ как приложение на 32 бита как другие упомянутые плакаты. Не забывайте об издержках. Вы создаете массив 93 миллионов объектов - если, оказывается, существует 4 байта издержек на объект, это составляет дополнительные 350 МБ памяти.
Просто дополнительный к другим точкам; если Вы хотите получить доступ к грязному объему памяти, рассматриваете x64 - но знаете, что максимум единственный размер объекта - все еще 2 ГБ. И потому что ссылки больше в x64, это означает, что Вы на самом деле становитесь меньшими максимальный размер массива/списка для ссылочных типов. Конечно, к тому времени, когда Вы поражаете тот предел, Вы, вероятно, делаете вещи неправильно так или иначе!
Другие опции:
(очевидно, у обоих есть различие в производительности по сравнению с незавершенной памятью)
<час> Обновление: В версиях.NET до 4,5, максимальный размер объекта составляет 2 ГБ. От 4,5 вперед можно выделить большие объекты, если gcAllowVeryLargeObjects включен. Обратите внимание, что предел для string
не затронут, но "массивы" должны покрыть "списки" также, так как списки поддерживаются массивами.
Только добавить к предыдущим ответам: можно пойти вне предела на 2 ГБ на системы, загруженные с/3Gb [и дополнительно userva] флаги начальной загрузки.