Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Память, общий вопрос

10K
31 мая 2011 года
Cybernetic
106 / / 22.07.2009
Я изучал литературу о .NET-овском сборщике мусора, но она мне так и не смогла ответить на один очень важный для меня вопрос.

Ситуация следующая. Нужно выбелить большие объемы данных. Допустим, массив int'ов из миллиарда элементов. Оперативной памяти в компьютере - 8ГБ.
Считаем, сколько это, миллиард интов
1000000000 * 4 = 4000000000 байт = 3906250 КБайт = 3814,7 МБайт = 3,73 Гбайт

+ еще нужно немного памяти на организацию всего это в массив. Должно уместиться.

Но на строке
 
Код:
int[] array = new int[1000000000];

Вылетает с сообщением OutOfMemoryException.

Вроде как массивы могут индексироваться типом int, а значит должны допускать индекс int.MaxValue. А это больше 2 миллиардов.

Я провел небольшой эксперимент, итогом которого стало:
1) Можно выделить память под массив из 100 миллионов элементов.
2) Это можно сделать 4 раза подряд.
3) На пятом опять получаю исключение.

Вопрос можно назвать философским, потому что вот его краткий итог: ПОЧЕМУ так происходит? Я явно что-то не знаю о работе стека и кучи памяти =)
277
31 мая 2011 года
arrjj
1.7K / / 26.01.2011
Для 32-х битных приложений максимум выделяется 2 гб оперативки на одно приложение. Какая ОС у тебя?
10K
31 мая 2011 года
Cybernetic
106 / / 22.07.2009
Цитата: arrjj
Какая ОС у тебя?


В свойствах системы пишется: "Тип системы: 64-разрядная операционная система"

297
31 мая 2011 года
koodeer
1.2K / / 02.05.2009
Сборщик мусора здесь совершенно ни при чём. Он не отвечает за выделение памяти.

Такой большой непрерывный кусок памяти выделить очень сложно. В системе-то свободная память есть, но она фрагментирована. Скорей всего.

Кстати, вот было обсуждение: http://rsdn.ru/forum/dotnet/4277317.flat.aspx#4277317
5
01 июня 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Cybernetic
Вопрос можно назвать философским, потому что вот его краткий итог: ПОЧЕМУ так происходит? Я явно что-то не знаю о работе стека и кучи памяти =)

В .NET есть ограничение на максимальный размер объекта (массивы это тоже объекты) - это 2ГБ. CLR просто не позволит создать объект больше.

5
01 июня 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: koodeer
Такой большой непрерывный кусок памяти выделить очень сложно. В системе-то свободная память есть, но она фрагментирована. Скорей всего.

В x64 процессе найти непрерывный блок виртуальных адресов такого размера - сущий пустяк. Об отображении этих виртуальных адресов на физические будет заботиться менеджер памяти ОС и процессор.

10K
02 июня 2011 года
Cybernetic
106 / / 22.07.2009
Цитата: hardcase
В .NET есть ограничение на максимальный размер объекта (массивы это тоже объекты) - это 2ГБ. CLR просто не позволит создать объект больше.


А почему я тогда последовательно создаю объекты(в моем случае массивы из 100 миллионов элементов), заведомо меньшие 2ГБ (не более 400 метров), но при создании пятого такого объекта вылетает exception?

5
02 июня 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Cybernetic
А почему я тогда последовательно создаю объекты(в моем случае массивы из 100 миллионов элементов), заведомо меньшие 2ГБ (не более 400 метров), но при создании пятого такого объекта вылетает exception?

Потому что в CLR 2.0 есть некое внутреннее ограничение на размер кучи больших объектов. В CLR 4.0 этого ограничения либо нет, либо оно значительно слабее.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог