Максимальная память 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 может распознать.

613   12  

12 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 java -XX:+PrintFlagsFinal

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

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

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

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

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

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

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

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

вот как увеличить размер подкачки

  1. щелкните правой кнопкой мыши на mycomputer - - - > свойства - - - > дополнительно
  2. В разделе Быстродействие нажмите кнопку Параметры
  3. выберите вкладку Дополнительно
  4. В разделе Виртуальная память нажмите кнопку Изменить. Он будет показывать УР ток подкачки размер.
  5. выберите диск, на котором доступно место на жестком диске.
  6. обеспечивает начальный размер и максимальный размер ...например, начальный размер 0 МБ и максимальный размер 4000 МБ. (Столько же, сколько и вы потребуется)

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

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

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

Comments

    Ничего не найдено.