Есть ли предел памяти для единственного процесса.NET

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

35
задан abatishchev 14 June 2010 в 14:33
поделиться

5 ответов

32 бита или 64 бита? 32 бита составляют 2 ГБ (для процесса), 64 бита 1 ТБ (сервер версии для предприятий 2003) .

Однако максимальный размер Объекта CLR составляет 2 ГБ даже на 64 битах.

Обновление: информация выше была корректна в 2008. См. ответ Ohad для более свежей информации. Сервер Windows 2016 может иметь максимум 24 ТБ .

44
ответ дан Community 27 November 2019 в 06:46
поделиться

В Windows на 32 бита можно получить немного больше памяти путем начальной загрузки Windows с флагом/3gb и установки флага приложения как "большой адрес, знающий"

4
ответ дан Sean 27 November 2019 в 06:46
поделиться

Matthias,

Не на самом деле ответ на прямой вопрос, но другой способ приблизиться к этой проблеме, которая обойдет некоторые большие ловушки, которые могут быть сильной головной болью с кэширующимися решениями. (Извините у меня нет рекомендуемого чтения по вопросу.)

Мы реализовали это в предыдущем проекте, и он действительно создавал другие проблемы.

Для офлайнового доступа, можно ли использовать экспресс sql на рабочих столах для создания зеркала базы данных (или просто бит, который необходимо кэшировать)? Тогда все, что необходимо сделать, переключиться, на какую базу данных приложение указывает. Можно даже использовать его, хранят diffs и воспроизводят их к серверу - хотя это имеет другие проблемы. Можно изменить полномочия на локальной копии для создания этого только для чтения, если это - то, как это должно быть.

словари Вы думаете о создании, замечательно походят на индексы Sql. Я полагался бы на sql, чтобы сделать задание для Вас, если можно спроектировать его тот путь. Почему перестраивают то колесо? Если Вы делаете, необходимо будет думать тщательно об истечении кэша и управлении памятью - особенно, если это - сервис окон.

Удача,

Sam

1
ответ дан Sam Meldrum 27 November 2019 в 06:46
поделиться

Как с любой другой Windows-программой, Вы ограничены адресным пространством. Это: на 32-разрядном у Вас может быть 2 ГБ адресного пространства. На x64 у Вас может быть 8 ТБ.

, Если у Вас нет 8 ТБ физической памяти, она начнет разбивать на страницы.

0
ответ дан Roger Lipscombe 27 November 2019 в 06:46
поделиться

В последнее время я занимаюсь обширным профилированием вокруг лимитов памяти в .NET на 32-битном процессе. Нас всех бомбардирует мысль, что мы можем выделить до 2.4 Гб (2^31) в .NET-приложении, но, к сожалению, это не так :(. Процесс работы приложения занимает столько места, и операционная система отлично справляется с ним, однако, сама .NET, похоже, имеет свои собственные накладные расходы, которые составляют около 600-800 МБ для типичных реальных приложений, которые превышают лимит памяти. Это означает, что как только вы выделяете массив целых чисел, который занимает около 1.4Гб, вы должны ожидать, что увидите OutOfMemoryException().

Очевидно, что в 64-битном случае этот лимит возникает намного позже (давайте пообщаемся через 5 лет :)), но общий размер всего в памяти также растет (я нахожу, что это ~1. От 7 до ~2 раз) из-за увеличенного размера слова.

Я точно знаю, что идея виртуальной памяти от операционной системы определенно НЕ дает практически бесконечное пространство для выделения в рамках одного процесса. Только так, чтобы все 2.4 Гб были адресованы всем (многим) приложениям, запущенным за один раз.

.
21
ответ дан 27 November 2019 в 06:46
поделиться
Другие вопросы по тегам:

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