32-битная Java на 64-битной ОС: есть ли ограничения на количество JVM? - PullRequest
4 голосов
/ 29 июня 2010

У меня есть сервер Solaris sparc (64-разрядный), который имеет 16 ГБ памяти.На нем запущено много небольших Java-процессов, но сегодня я получил ошибку «Не удалось зарезервировать достаточно места для кучи объектов» при попытке запустить новый.Я был удивлен, так как на сервере оставалось более 4 ГБ свободного места.Новый процесс удалось успешно запустить после того, как некоторые другие процессы были закрыты;система определенно достигла какого-то предела.

После поиска в Интернете объяснений я начал задумываться, не связано ли это с тем, что я использую 32-разрядную JVM (ни одна изjava-процессы на этом сервере требуют очень много памяти).

Я считаю, что максимальный пул памяти по умолчанию составляет 64 МБ, и я выполнял около 64 из этих процессов.Так что все будет 4 ГБ ... прямо на 32-битном пределе.Но я не понимаю, почему или как на какой-либо из этих процессов будут влиять другие.Если я прав, то для запуска большего количества этих процессов мне придется либо настроить максимальную кучу ниже, чем по умолчанию, либо переключиться на использование 64-битной JVM (что может означать повышение максимальной кучи).быть выше, чем значение по умолчанию для этих процессов).Я не против ни одного из них, но я не хочу тратить время впустую, и это все еще выстрел в темноте прямо сейчас.

Может кто-нибудь объяснить, почему это может работать таким образом?Или я полностью ошибаюсь?

Если я прав насчет объяснения, то, вероятно, есть документация по этому вопросу: я бы очень хотел его найти.(Я запускаю обновление JDK 6 от Sun, если это имеет значение.)

Редактировать : Я полностью ошибся .Приведенные ниже ответы подтвердили мой инстинктивный инстинкт, что нет причины, по которой я не смогу запустить столько JVM, сколько смогу удержать.Через некоторое время на том же сервере я получил ошибку при попытке запустить не-Java-процесс: «fork: недостаточно места».Так что есть еще одно ограничение, с которым я сталкиваюсь и которое не зависит от Java.Я должен выяснить, что это такое (нет, это не пространство подкачки).Скорее всего, к серверу я иду.

Ответы [ 2 ]

3 голосов
/ 29 июня 2010

Я считаю, что максимальный пул памяти по умолчанию составляет 64 МБ, и я выполнял около 64 из этих процессов.Так что это все 4 ГБ ... прямо на 32-битном пределе.

Нет.32-битное ограничение на процесс (по крайней мере, на 64-битной ОС).Но максимальный размер кучи по умолчанию не фиксирован и равен 64 МБ :

начальный размер кучи: больше 1/64 физической памяти компьютера или некоторый разумный минимум.*

максимальный размер кучи: меньше 1/4 от физической памяти или 1 ГБ.

Примечание. Границы и доли, указанные для размера кучи, соответствуют J2SE 5.0.Они могут отличаться в последующих выпусках, поскольку компьютеры становятся все более мощными.

1 голос
/ 29 июня 2010

Я подозреваю, что память фрагментирована. Проверьте также Инструменты для просмотра / устранения фрагментации памяти в Windows XP для подтверждения того, что фрагментация памяти может вызвать такие ошибки.

...