Понимание максимального размера кучи JVM - 32 бит против 64 бит

Я читаю максимальный размер кучи на 32-битной Windows составляет ~ 1,5 ГБ, что связано с тем, что для JVM требуется непрерывная память. Может ли кто-то объяснить концепцию "непрерывной памяти" и почему у вас всего 1,5 ГБ на Windows?

Во-вторых, что такое максимальный размер кучи на 64-битной Windows и почему это отличается от того, что доступно на 32-битной версии?

Ответ 1

32-разрядная/64-разрядная часть не связана с Java

Оказывается, что в ячейках памяти в 32-битной системе ссылаются 32-разрядные целые числа без знака. Это позволяет использовать до 2 ^ 32 возможных мест памяти. Поскольку в каждом местоположении хранится 1 байт, вы получаете 2 ^ 32 байта или 4 ГБ, если хотите.

В 64-битной системе есть 2 ^ 64 места или 16 экзабайт.

Теперь в Windows смежная часть становится большой проблемой, но это как раз то, как Windows делает вещи. Идея состоит в том, что для вашей кучи вам нужен целый "непрерывный" диапазон. К сожалению, Windows выделяет некоторую память где-то посередине. Это в основном оставляет вам примерно половину левой или половиной правой стороны, около 1,5-2 Гбайт кусков, чтобы выделить вашу кучу.

Зайдите в этот вопрос для более подробной информации о 32-битной 64-разрядной версии.

Изменить: Спасибо mrjoltcola за префикс exa!

Ответ 2

Смежный просто означает "без пробелов" - один длинный отдельный сегмент. Сумма ограничена тем, насколько большой сегмент OS может отображать для вашего процесса. Независимо от того, требуется ли Java для непрерывной кучи или нет, это проблема реализации, характерная для JVM, и может не существовать для других виртуальных машин.

Ответ 3

Непрерывная память не является проблемой, ограничивающей использование окон только 1, 2 ГБ кучи. Несмотря на то, что минимальная/максимальная куча определена, JVM будет занимать максимальную кучу из системной памяти при запуске. Затем он будет ссылаться только на минимальную кучу в пределах занятой системной памяти, пока она не будет расширяться. Непрерывная память максимальной кучи требуется для запуска JVM в большей части импликации, чтобы улучшить производительность.

Как объяснил Маркус выше, предел 32-битного аппаратного обеспечения составляет 4 ГБ для одного процесса (потока). Каждая операционная система адресует это 4 ГБ по-разному. 4 ГБ существенно разделены на пространство ядра и пространство пользователя. В 32-битных окнах максимальное пространство пользователя составляет около 1,5 ГБ. Есть возможность загружать окна с/3GB-переключателем, чтобы иметь больше пользовательского пространства.