Понимание макс. размера "кучи" JVM - 32 бита по сравнению с 64 битами

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

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

33
задан Community 23 May 2017 в 12:34
поделиться

3 ответа

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!

36
ответ дан 27 November 2019 в 18:30
поделиться

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

6
ответ дан 27 November 2019 в 18:30
поделиться

Непрерывная память не является проблемой, ограничивая использование windows только 1.2 ГБ кучи. Даже если определены min/max кучи, JVM при запуске займет максимальную кучу из системной памяти. Затем она будет ссылаться только на min кучу в пределах занятой системной памяти, пока ей не потребуется расширение. В большинстве импликаций для запуска JVM требуется непрерывная память максимальной кучи для улучшения производительности.

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

4
ответ дан 27 November 2019 в 18:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: