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

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

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

Ответы [ 3 ]

36 голосов
/ 16 марта 2010

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!

6 голосов
/ 16 марта 2010

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

4 голосов
/ 30 июля 2010

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

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

...