32-битная Java на 64-битной ОС: существует ли ограничение на количество JVM?


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

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

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

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

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

править: я совершенно ошибся. Ответы ниже подтвердили мой внутренний инстинкт, что нет никаких причин, почему я не могу запустить столько JVM, сколько я могу держать. Некоторое время спустя я получил сообщение об ошибке на том же сервере, пытаясь запустить процесс не java: "fork: недостаточно места". Так что есть еще один предел, с которым я сталкиваюсь, который не является специфичным для java. Я должен буду это выяснить. что это такое (нет, это не пространство подкачки). Скорее всего, я отправлюсь в serverfault.

2 4

2 ответа:

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

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

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

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

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

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