32-битные JVM, которые рассчитывают иметь один большой кусок памяти и используют необработанные указатели, не могут использовать более 4 Гб (поскольку это 32-битный предел, который также применяется к указателям). Это включает в себя Sun и - я почти уверен - также реализации IBM. Я не знаю, есть ли у JRockit или других большой объем памяти в их 32-битных реализациях.
Если вы ожидаете, что достигнете этого предела, вам следует серьезно подумать о запуске параллельного трека, проверяющего 64-битную JVM для вашей производственной среды, чтобы вы были готовы к этому, когда 32-битная среда выйдет из строя. В противном случае вам придется выполнять эту работу под давлением, что никогда не бывает хорошо.
Изменить 2014-05-15: Oracle FAQ:
Максимальный теоретический предел кучи для 32-разрядной JVM составляет 4G. Из-за различных дополнительных ограничений, таких как доступный своп, использование адресного пространства ядра, фрагментация памяти и накладные расходы виртуальной машины, на практике предел может быть намного ниже. В большинстве современных 32-разрядных систем Windows максимальный размер кучи составляет от 1,4 ГБ до 1,6 ГБ. В 32-разрядных ядрах Solaris адресное пространство ограничено 2 ГБ. В 64-разрядных операционных системах, на которых работает 32-разрядная виртуальная машина, максимальный размер кучи может быть выше, приближаясь к 4G во многих системах Solaris.
( http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_heap_32bit )
Торбьёрн Равн Андерсен
источник
Вы можете спросить у Java Runtime:
Это сообщит «Макс. Объем памяти» на основе распределения кучи по умолчанию. Так что вам все равно придется поиграть
-Xmx
(на HotSpot ). Я обнаружил, что при работе в 64-разрядной версии Windows 7 Enterprise моя 32-разрядная JVM HotSpot может выделить до 1577 МБ:В то время как с 64-битной JVM в той же ОС, конечно, намного больше (около 3 ТиБ)
Как уже упоминалось, это зависит от ОС.
Для 64-разрядной ОС хоста, если JVM 32-разрядная, она все равно будет зависеть, скорее всего, как показано выше.
- ОБНОВЛЕНИЕ 20110905 : Я просто хотел указать на некоторые другие наблюдения / детали:
Runtime.MaxMemory
которую можно выделить, также зависит от рабочего набора операционной системы . Однажды я запустил это, когда у меня также был запущен VirtualBox, и обнаружил, что не могу успешно запустить JVM HotSpot, и мне-Xmx1590M
пришлось уменьшить размер. Это также означает, что вы можете получить более 1590 МБ в зависимости от размера вашего рабочего набора в то время (хотя я по-прежнему утверждаю, что для 32-разрядной версии это будет менее 2 ГБ из-за дизайна Windows)источник
Вы не указываете, какая ОС.
Под Windows (для моего приложения - давно работающего приложения для управления рисками) мы заметили, что мы не можем пойти дальше 1280 МБ на 32-битной Windows. Я сомневаюсь, что запуск 32-битной JVM под 64-битной версией будет иметь какое-то значение.
Мы портировали приложение на Linux, и мы запускаем 32-битную JVM на 64-битном оборудовании, и у нас довольно легко работает виртуальная машина 2,2 ГБ.
Самая большая проблема, с которой вы можете столкнуться, - это сборщик мусора, в зависимости от того, для чего вы используете память.
источник
Из 4.1.2 Размер кучи :
Нашел здесь довольно хороший ответ: максимальная память Java в Windows XP .
источник
У нас недавно был некоторый опыт в этом. Недавно мы перенесли Solaris (x86-64 версии 5.10) на Linux (RedHat x86-64) и поняли, что у нас меньше памяти для 32-битного процесса JVM в Linux, чем у Solaris.
Для Solaris это почти 4 ГБ (http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_heap_32bit).
Мы запускали наше приложение с -Xms2560m -Xmx2560m -XX: MaxPermSize = 512m -XX: PermSize = 512m без каких-либо проблем на Solaris в течение последних нескольких лет. Пытался переместить его в Linux, и у нас возникли проблемы со случайными ошибками нехватки памяти при запуске. Мы могли только заставить его постоянно запускаться на -Xms2300 -Xmx2300 . Потом нам об этом сообщили в службе поддержки.
источник
Ограничения 32-битной JVM в 64-битной ОС будут точно такими же, как ограничения 32-битной JVM в 32-битной ОС. В конце концов, 32-битная JVM будет работать на 32-битной виртуальной машине (в смысле виртуализации), поэтому она не будет знать, что она работает на 64-битной ОС / машине.
Одно из преимуществ использования 32-разрядной JVM в 64-разрядной ОС по сравнению с 32-разрядной ОС заключается в том, что у вас может быть больше физической памяти и, следовательно, вы будете реже сталкиваться с подкачкой / подкачкой страниц. Однако это преимущество действительно полностью реализуется только при наличии нескольких процессов.
источник
Когда я работал в BEA, мы обнаружили, что среднее приложение на самом деле работает медленнее в 64-битной JVM, чем при работе в 32-битной JVM. В некоторых случаях снижение производительности было на 25% медленнее. Итак, если вашему приложению действительно не нужна вся эта дополнительная память, вам лучше установить больше 32-битных серверов.
Насколько я помню, три наиболее распространенных технических обоснования использования 64-битной системы, с которыми столкнулись специалисты BEA по оказанию профессиональных услуг, были:
.
источник
JROCKIT JVM, в настоящее время принадлежащая Oracle, поддерживает использование несмежной кучи, что позволяет 32-битной JVM получать доступ к более чем 3,8 ГБ памяти, когда JVM работает в 64-битной ОС Windows. (2,8 ГБ при работе в 32-битной ОС).
http://blogs.oracle.com/jrockit/entry/how_to_get_almost_3_gb_heap_on_windows
JVM можно бесплатно загрузить (требуется регистрация) по адресу
http://www.oracle.com/technetwork/middleware/jrockit/downloads/index.html
источник
Вот некоторые тесты под Solaris и Linux 64-bit
Solaris 10 - SPARC - машина T5220 с 32 ГБ ОЗУ (и около 9 ГБ свободно)
BTW: Очевидно, Java не выделяет много фактической памяти при запуске. Казалось, что на запуск каждого экземпляра требовалось всего около 100 МБ (я запускал 10)
Solaris 10 - x86 - VMWare VM с 8 ГБ ОЗУ (около 3 ГБ свободно *)
Свободная оперативная память 3 ГБ - это не совсем так. Кэш ZFS использует большой кусок ОЗУ, но у меня нет доступа root, чтобы проверить, сколько именно
RedHat 5.5 - x86 - VMWare VM с 4 ГБ ОЗУ (используется около 3,8 ГБ - 200 МБ в буферах и 3,1 ГБ в кэше, поэтому около 3 ГБ свободно)
Та же машина с JRE 7
источник
Должно быть намного лучше
Для 32-битной JVM, работающей на 64-битном хосте, я полагаю, что то, что останется для кучи, будет любым нефрагментированным виртуальным пространством, доступным после JVM, собственной DLL и любыми 32-битными материалами совместимости с ОС. Как дикое предположение, я бы подумал, что 3 ГБ должно быть возможно, но насколько это лучше, зависит от того, насколько хорошо вы справляетесь с 32-битным хостом.
Кроме того, даже если вы могли бы создать гигантскую кучу 3 ГБ, вы, возможно, не захотите, так как это приведет к тому, что паузы сборщика мусора станут потенциально неприятными. Некоторые люди просто запускают больше JVM, чтобы использовать дополнительную память, а не одну гигантскую. Я предполагаю, что прямо сейчас они настраивают JVM, чтобы лучше работать с гигантскими кучами.
Немного сложно точно сказать, насколько лучше вы можете сделать. Думаю, вашу 32-битную ситуацию легко определить экспериментальным путем. Трудно предсказать абстрактно, поскольку на это влияет множество факторов, особенно потому, что виртуальное пространство, доступное на 32-битных хостах, довольно ограничено. Куча действительно должна существовать в непрерывной виртуальной памяти, поэтому фрагментация адресного пространства для dll и внутреннее использование адресного пространства ядром ОС будет определять диапазон возможных распределений.
ОС будет использовать часть адресного пространства для сопоставления устройств HW и собственных динамических распределений. Хотя эта память не отображается в адресное пространство Java-процесса, ядро ОС не может получить доступ к ней и к вашему адресному пространству одновременно, поэтому оно ограничит размер виртуального пространства любой программы.
Загрузка DLL зависит от реализации и выпуска JVM. Загрузка ядра ОС зависит от огромного количества вещей, от выпуска, HW, от того, сколько вещей было сопоставлено с момента последней перезагрузки, кто знает ...
В итоге
Бьюсь об заклад, вы получите 1-2 ГБ в 32-битной среде и около 3 в 64-битной, так что общее улучшение примерно в 2 раза .
источник
В Solaris ограничение составляет около 3,5 ГБ, начиная с версии Solaris 2.5. (около 10 лет назад)
источник
У меня были те же проблемы с JVM, которые использует App Inventor для Android Blocks Editor. Максимальный размер кучи составляет 925 м. Этого недостаточно, но я не мог установить его больше, чем около 1200 м, в зависимости от различных случайных факторов на моей машине.
Я загрузил Nightly, бета-версию 64-битного браузера из Firefox, а также 64-битную версию JAVA 7.
Я еще не нашел свой новый предел кучи, но я только что открыл JVM с размером кучи 5900 м . Нет проблем!
Я использую 64-разрядную версию Win 7 Ultimate на машине с 24 ГБ ОЗУ.
источник
Я попытался установить размер кучи до 2200 МБ на 32-битной машине Linux, и JVM работала нормально. JVM не запускалась, когда я установил ее на 2300M.
источник
Это тяжеловесный тюнинг, но можно получить кучу 3гб.
http://www.microsofttranslator.com/bv.aspx?from=&to=en&a=http://forall.ru-board.com/egor23/online/FAQ/Virtual_Memory/Limits_Virtual_Memory.html
источник
еще один момент для точки доступа 32-битной JVM: - собственная емкость кучи = 4 гигабайта - Java Heap - PermGen;
Это может стать особенно сложно для 32-разрядной JVM, поскольку Java Heap и собственная Heap находятся в гонке. Чем больше ваша Java Heap, тем меньше собственная Heap. Попытка настроить большую кучу для 32-разрядной виртуальной машины, например. 2,5 ГБ + увеличивает риск возникновения ошибки OutOfMemoryError в зависимости от занимаемой площади вашего приложения, количества потоков и т. Д.
источник
Ограничение также связано с тем, что для
32 bit
виртуальной машиныheap
она должна начинаться с нулевого адреса, если вы хотите все это4GB
.Подумайте об этом, если вы хотите ссылаться на что-то через:
то есть: ссылка, которая имеет это конкретное представление битов, это означает, что вы пытаетесь получить доступ к самой первой памяти из кучи. Чтобы это было возможно, куча должна начинаться с нулевого адреса. Но этого никогда не происходит, он начинается с некоторого смещения от нуля:
Поскольку куча никогда не начинается с нулевого адреса в файле
OS
, существует довольно много битов, которые никогда не используются из32
ссылки на биты, и поэтому куча, на которую можно ссылаться, меньше.источник
Теоретически 4 ГБ, но на практике (для IBM JVM):
Win 2k8 64, IBM Websphere Application Server 8.5.5 32 бит
C:\IBM\WebSphere\AppServer\bin>managesdk.bat -listAvailable -verbose CWSDK1003I: Доступные SDK: CWSDK1005I: Имя SDK: 1.6_32 - com.ibm.websphere.sdk.version.1.6_32=1.6 - com.ibm.websphere.sdk.bits.1.6_32=32 - com.ibm.websphere.sdk.location.1.6_32=${WAS_INSTALL_ROOT}/java - com.ibm.websphere.sdk.platform.1.6_32=windows - com.ibm.websphere.sdk.architecture.1.6_32=x86_32 - com.ibm.websphere.sdk.nativeLibPath.1.6_32=${WAS_INSTALL_ROOT}/lib/native/win /x86_32/ CWSDK1001I: Задача managesdk выполнена успешно. C:\IBM\WebSphere\AppServer\java\bin>java -Xmx2036 MaxMemory JVMJ9GC017E -Xmx слишком мала, должна быть не меньше 1 M байт JVMJ9VM015W Ошибка инициализации для библиотеки j9gc26(2): Не удалось инициализи ровать Could not create the Java virtual machine. C:\IBM\WebSphere\AppServer\java\bin>java -Xmx2047M MaxMemory Total Memory: 4194304 (4.0 MiB) Max Memory: 2146435072 (2047.0 MiB) Free Memory: 3064536 (2.9225692749023438 MiB) C:\IBM\WebSphere\AppServer\java\bin>java -Xmx2048M MaxMemory JVMJ9VM015W Ошибка инициализации для библиотеки j9gc26(2): Не удалось создать эк земпляр кучи; запрошено 2G Could not create the Java virtual machine.
RHEL 6.4 64, IBM Websphere Application Server 8.5.5 32 бит
[bin]./java -Xmx3791M MaxMemory Total Memory: 4194304 (4.0 MiB) Max Memory: 3975151616 (3791.0 MiB) Free Memory: 3232992 (3.083221435546875 MiB) [root@nagios1p bin]# ./java -Xmx3793M MaxMemory Total Memory: 4194304 (4.0 MiB) Max Memory: 3977248768 (3793.0 MiB) Free Memory: 3232992 (3.083221435546875 MiB) [bin]# /opt/IBM/WebSphere/AppServer/bin/managesdk.sh -listAvailable -verbose CWSDK1003I: Available SDKs : CWSDK1005I: SDK name: 1.6_32 - com.ibm.websphere.sdk.version.1.6_32=1.6 - com.ibm.websphere.sdk.bits.1.6_32=32 - com.ibm.websphere.sdk.location.1.6_32=${WAS_INSTALL_ROOT}/java - com.ibm.websphere.sdk.platform.1.6_32=linux - com.ibm.websphere.sdk.architecture.1.6_32=x86_32 -com.ibm.websphere.sdk.nativeLibPath.1.6_32=${WAS_INSTALL_ROOT}/lib/native/linux/x86_32/ CWSDK1001I: Successfully performed the requested managesdk task.
источник