Максимальная максимальная память Java в Windows XP

Я всегда мог выделить 1400 мегабайт для Java SE, работающих на 32-разрядной Windows XP (Java 1.4, 1.5 и 1.6).

java -Xmx1400m ...

Сегодня я попробовал ту же опцию на новой машине под управлением Windows XP с использованием Java 1.5_16 и 1.6.0_07 и получил ошибку:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

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

Любые идеи, почему одна машина позволяла бы 1400, а другая - только 1200?

Изменить: аппарат имеет 4 ГБ оперативной памяти с объемом 3,5 ГБ, которые Windows может распознать.

Ответы

Ответ 1

Имейте в виду, что Windows имеет управление виртуальной памятью, а для JVM требуется только память, которая смежна в адресном пространстве. Таким образом, другие программы, запущенные в системе, не обязательно должны влиять на размер вашей кучи. На вашем пути будет DLL, загружаемая в ваше адресное пространство. К сожалению, оптимизация в Windows, которая минимизирует перемещение DLL во время компоновки, делает ее более вероятной, у вас будет фрагментированное адресное пространство. Вещи, которые, вероятно, сократят ваше адресное пространство, помимо обычных вещей, включают программное обеспечение безопасности, программное обеспечение CBT, программы-шпионы и другие виды вредоносного ПО. Вероятными причинами различий являются разные патчи безопасности, версии C и т.д. Драйверы устройств и другие биты ядра имеют собственное адресное пространство (остальные 2 ГБ 32-битного пространства 4 ГБ).

Вы можете попробовать использовать свои привязки DLL в вашем JVM-процессе и попытаться переустановить свою DLL-систему в более компактное адресное пространство. Не весело, но если вы в отчаянии...

В качестве альтернативы вы можете просто переключиться на 64-битную Windows и 64-битную JVM. Несмотря на то, что другие предложили, в то время как он будет пережевывать больше оперативной памяти, у вас будет гораздо более смежное виртуальное адресное пространство, а выделение 2 ГБ будет тривиально.

Ответ 2

Это связано с непрерывной памятью.

Вот некоторая информация, которую я нашел в Интернете, для кого-то, кто спрашивает об этом раньше, предположительно, от "бога VM":

Причина, по которой нам нужна непрерывная память регион для кучи состоит в том, что мы имеем связка боковых структур данных, которые индексируются (масштабированными) смещениями из начало кучи. Например, мы отслеживать ссылки на объект "массив маркеров карт", который имеет один байт для каждых 512 байтов кучи. Когда мы храните ссылку в куче, которую мы имеем отметить соответствующий байт в массив маркеров. Мы правильно сдвигаем адрес назначения магазина и используйте, чтобы индексировать массив маркеров. Веселые арифметические игры не может сделать на Java, к которому вы to:-) играть на С++.

Обычно у нас нет проблем с получением скромные смежные области (до 1,5 ГБ на Windohs, до 3,8 ГБ на Solaris. YMMV.). В Windohs проблема в основном состоит в том, что есть некоторые библиотеки, которые загружаются до JVM запускает, чтобы разбить адресное пространство. Использование переключателя /3GB не будут переустанавливать эти библиотеки, поэтому они все еще проблема для нас.

Мы знаем, как делать куча кучи, но будут некоторые накладные расходы на использование их. У нас больше запросов на более быстрое управления хранением, чем для большие кучи в 32-битной JVM. если ты действительно хотят большие кучи, переключитесь на 64-разрядная JVM. Нам все еще нужно смежное памяти, но гораздо легче войти в 64-разрядное адресное пространство.

Ответ 3

Ограничения размера кучи Java для Windows:

  • максимум возможный размер кучи на 32-битной Java: 1,8 ГБ
  • рекомендуется ограничение размера кучи на 32-разрядной Java: 1,5 ГБ (или 1,8 ГБ с опцией /3 ГБ)

Это не поможет вам получить большую кучу Java, но теперь вы знаете, что не можете выйти за эти значения.

Ответ 4

Oracle JRockit, который может обрабатывать несмежную кучу, может иметь размер кучи Java 2,85 ГБ в Windows 2003/XP с /3GB. Похоже, что фрагментация может иметь большое влияние на то, насколько большой может быть куча Java.

Ответ 5

JVM нуждается в непрерывной памяти и в зависимости от того, что еще работает, что было раньше, и как Windows управляет памятью, вы можете получить до 1,4 ГБ непрерывной памяти. Я думаю, 64-битная Windows позволит больше кучи.

Ответ 6

Sun JVM требуется непрерывная память. Таким образом, максимальный объем доступной памяти определяется фрагментацией памяти. В особенности драйверы DLL имеют тенденцию фрагментировать память при загрузке в некоторый предопределенный базовый адрес. Поэтому ваше оборудование и его драйверы определяют, сколько памяти вы можете получить.

Два источника для этого с утверждениями инженеров Sun: forum блог

Может быть, другая JVM? Вы пробовали Harmony? Я думаю, они планировали разрешить не непрерывную память.

Ответ 7

Я думаю, что это больше связано с тем, как Windows настроена так, как это намечено этим ответом: Java -Xmx Option

Еще несколько тестов: я смог выделить 1300 МБ на старом компьютере под управлением Windows XP с физической памятью 768 МБ (плюс виртуальная память). На моем 2 ГБ оперативной памяти я могу получить только 1220 МБ. На других корпоративных машинах (с более ранней Windows XP) я смог получить 1400 МБ. Машина с пределом 1220 МБ довольно новая (только что купленная у Dell), поэтому, возможно, она имеет более новые (и более раздутые) Windows и DLL (она работает под управлением Windows XP Pro версии 2002 с пакетом обновления 2).

Ответ 8

Я получил это сообщение об ошибке при запуске java-программы из (ограниченной памяти) virtuozzo VPS. Я не указал аргументы памяти и обнаружил, что мне нужно явно указать небольшую сумму, поскольку значение по умолчанию должно быть слишком высоким. Например. -Xmx32m (очевидно, необходимо настроить в зависимости от запускаемой программы).

Просто поместите это здесь, если кто-то еще получит указанное выше сообщение об ошибке, не указав большой объем памяти, как этот вопросник.

Ответ 9

sun JDK/JRE требует непрерывного объема памяти, если вы выделяете огромный блок.

ОС и начальные приложения имеют тенденцию выделять биты и куски во время загрузки, которая обрывает доступную ОЗУ. Если непрерывный блок НЕ доступен, SUN JDK не может его использовать. JRockit из Bea (приобретенный Oracle) может выделять память из кусков.

Ответ 10

Кажется, что все отвечают о непрерывной памяти, но не обратили внимания на более насущную проблему.

Даже при 100% смежном распределении памяти вы не можете иметь размер кучи размером 2 гигабайта в 32-разрядной ОС Windows (* по умолчанию). Это связано с тем, что 32-разрядные процессы Windows не могут обрабатывать более 2 гигабайт пространства.

Процесс Java будет содержать perm gen (pre Java 8), размер стека для потока, накладные расходы JVM/библиотеки (что значительно увеличивается с каждой сборкой) все в дополнение к куче.. p >

Кроме того, флаги JVM и их значения по умолчанию изменяются между версиями. Просто запустите следующее, и вы получите представление:

 java -XX:+PrintFlagsFinal

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

Повторное использование частей этого моего ответа (о Tomcat, но применимо к любому процессу Java):

Операционная система Windows ограничивает распределение памяти 32-разрядного процесса до 2 гигабайт в целом (по по умолчанию).

[Вы сможете только] выделить около 1,5 ГБ кучи пространство, потому что есть и другая память, выделенная для процесса (служебные данные JVM/библиотеки, пространство perm gen и т.д.).

Почему 32-разрядная Windows накладывает ограничение на адресное пространство процесса 2 ГБ, но 64-битная Windows накладывает ограничение на 4 ГБ?

Другие современные операционные системы [cough Linux] позволяют 32-битные процессы используйте все (или большинство) адресного пространства 4 GiB.

Тем не менее, 64-битная ОС Windows может быть настроена на увеличение лимита 32-битных процессов до 4 GiB (3 гигабайта на 32-битных):

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx

Ответ 11

Вот как увеличить размер пейджинга

  • щелкните правой кнопкой мыши на mycomputer --- > свойства --- > Дополнительно
  • в разделе настроек производительности нажмите
  • нажмите вкладку "Дополнительно".
  • В разделе "Виртуальная память" нажмите "Изменить". Он покажет текущий пейджинг ur размер.
  • Выберите "Диск", на котором доступно место на жестком диске.
  • Укажите начальный размер и максимальный размер... например. начальный размер 0 МБ и максимальный размер 4000 МБ. (Насколько вам потребуется)

Ответ 12

Во-первых, использование файла страницы, когда у вас 4 ГБ ОЗУ, бесполезно. Windows не может получить доступ к более чем 4 ГБ (фактически, меньше из-за отверстий в памяти), поэтому файл страницы не используется.

Во-вторых, адресное пространство разделяется на 2, половина для ядра, половина - для пользовательского режима. Если вам нужно больше ОЗУ для ваших приложений, используйте параметр /3GB в boot.ini(убедитесь, что java.exe помечен как "большой адрес" (для получения дополнительной информации о Google).

В-третьих, я думаю, что вы не можете выделить полные 2 ГБ адресного пространства, потому что java отнимает часть памяти внутри (для потоков, JIT-компилятора, инициализации VM и т.д.). Используйте переключатель /3GB для более.