Пространство кучи Java и оперативная память

У меня вопрос, который меня обеспокоил после прочтения статьи об анализе дампов потоков. В одном абзаце упоминалось, что логический максимальный размер кучи в 32-битной JVM составляет 4 ГБ.

В этой ссылке указано, что максимальный размер кучи на 32-битной Машина с Windows будет около 1,4 - 1,6 ГБ.

Мой вопрос: скажем, если у вас есть ОЗУ, скажем, около 8 ГБ, означает ли это, что я могу использовать только 1,4–1,6 ГБ, если бы я был для вас 32-разрядной JVM? И какой максимальный размер разрешен для 64-битной JVM?

Цените вашу помощь в этом, так как я смущен тем же.


person dinukadev    schedule 07.02.2014    source источник
comment
Максимальная адресуемая память для 32-битной машины = 2 ^ 32 = 4294967296 = ~ 4 ГБ. Вам нужно место для вашей ОС, страниц других запущенных приложений и т. Д.   -  person C.B.    schedule 07.02.2014
comment
Да, это так, и для 64-битной JVM ограничение настолько велико, что может быть бесконечным (16 эксбибайт).   -  person Boris the Spider    schedule 07.02.2014
comment
Возможно дублирование stackoverflow.com/questions/7663174/. На некоторых системах действует ограничение ~ 1,5 ГБ. Для 64-битного быстрого ответа - около 2 ^ 64, ОС может ограничивать   -  person chro    schedule 07.02.2014


Ответы (4)


В частности, в Windows причина заключается в сочетании реализации точки доступа (JVM Sun / Oracle) и DLL Windows.

32-битный код имеет доступ к виртуальному адресному пространству 4 ГБ (есть расширения, которые позволяют больше, но я не буду вдаваться в них).

в 32-битных окнах верхние 2 ГБ этого виртуального адресного пространства зарезервированы для использования операционной системы (некоторые версии ОС принимают / 3GB в качестве параметра загрузки, позволяющего выделить 3 ГБ доступного для пользователя пространства).

Кроме того, любые используемые вами библиотеки (* .dll) отображаются на части этого адресного пространства. по умолчанию файлы * .dll базы Windows загружаются на отметке ~ 1,6 ГБ (немного отличается в зависимости от версии ОС и уровня исправления)

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

Итак, если вы попытаетесь представить это в своей голове, вы увидите, что у вас есть свободная область размером ~ 2 ГБ с "стеной" из файлов windows * .dll, загруженных на ~ 1,6 ГБ. это логика, стоящая за этой цифрой. это также означает, что даже если вы укажете флаг / 3GB, Sun / oracle JVM не сможет его использовать. некоторые другие виртуальные машины лучше справляются с фрагментированной кучей - например, jrockit VM

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

также обратите внимание, что вполне возможно, что драйверы / приложения, загруженные на определенных машинах (например, антивирусное программное обеспечение), будут внедрять свои собственные * .dll в процесс java, и эти dll могут быть загружены по еще более низким адресам памяти, что еще больше уменьшит вашу используемую кучу космос.

в 64-битных версиях Windows адресный лимит составляет 8–128 ТБ, а физический лимит сейчас составляет 64 ТБ

person radai    schedule 07.02.2014
comment
Спасибо за очень подробный ответ. Спасибо, что нашли время дать мне исчерпывающий ответ. - person dinukadev; 07.02.2014
comment
+1 от меня - это потрясающий ответ. Вдумчивый, хорошо написанный. - person duffymo; 07.02.2014

2 ^ 32 = 4 ГБ - это максимальный общий объем памяти, который вы можете адресовать с помощью 32 бит.

JVM получает только 1,4–1,6 ГБ на 32-битных машинах, потому что вам все еще нужно разместить операционную систему.

2 ^ 64 = (2 ^ 32) ^ 2 - это максимальный общий объем памяти, который вы можете адресовать с помощью 64 бит. Как видите, это намного большее число.

person duffymo    schedule 07.02.2014
comment
Спасибо за ответ. Это было очень полезно. - person dinukadev; 07.02.2014

jvm, а также ОС используют систему управления памятью подкачки, которая получает виртуальную память 4G для нас в

32-битные ОС

но если у вас 8G RAM, вы должны использовать 64-битную версию ОС для максимальной производительности ОС.

person Ashouri    schedule 07.02.2014
comment
Спасибо, что нашли время ответить. Ваш ответ был полезен. - person dinukadev; 07.02.2014

Это зависит от вашей операционной системы, 32-разрядные версии MacOS X и Linux имеют некоторую возможность доступа к более чем 4 ГБ в ядре, но по-прежнему ограничивают процессы до 4 ГБ. Другие операционные системы могут дополнительно ограничивать память процесса, поскольку им нужна часть 4 ГБ для себя. В общем, вы не хотите менять свою JVM на виртуальную машину, поэтому вам нужно знать, сколько свободной памяти есть в вашей системе.

person Michael Shopsin    schedule 07.02.2014
comment
@dunukadev см. apple.stackexchange.com/questions/2498/ для более подробного объяснения сложностей MacOS X 32-битный против 64-битного режима. - person Michael Shopsin; 07.02.2014