Как я могу запустить программу на Java с большой максимальной кучей?

Я использую программу захвата памяти (CrashPlan), написанную на Java, которой иногда при пиковой нагрузке требуется около 1,5 ГБ памяти (это контролируется параметром -Xmx1500M).

Обычно (и по крайней мере при запуске) ему требуется очень мало памяти, но при значениях ниже -Xmx1500M происходит сбой при пиковой нагрузке. После запуска (с -Xmx1000M) Диспетчер задач показывает использование своей памяти около 100 МБ в рабочем наборе, частном наборе и выделенной памяти.

Однако Java VM не может начинаться с -Xmx1500M, я полагаю, потому что не удается выделить эту память. (С -Xmx1000M он запускается, но позже вылетает.)

Я использую 32-битную Windows 7 pro (не 64-битную) с установленной памятью 32 ГБ (доступно 3 ГБ и файл подкачки на большом диске ОЗУ в недоступной памяти).

Я ожидал бы, что Windows поменяет другие процессы, чтобы выделить память для Java, и, поскольку Java все равно не использует ее, поменяет неиспользуемую память Java на файл подкачки. Скажем, сейчас я вижу процесс mydefrag, использующий выделенный набор 1700 МБ, без проблем.

(Кажется, до прошлой недели это работало так. Потом что-то изменилось.)

Как я могу заставить Java начинаться с -Xmx1500M?

1 ответ1

1

Как вы уже поняли, адресная память вашего пользовательского процесса ограничена 2 ГБ в 32-битных окнах (половина адресного пространства 4 ГБ зарезервирована для ОС). Но вы также должны принять во внимание, что кучи-память - не единственный вид памяти, который использует Java-VM: есть также требования к собственному выделению памяти, пространству стека, perm-gen, кэш-коду и т.д. Все они имеют прийти из тех же 2GB, которые доступны. Таким образом, точный максимальный размер кучи может варьироваться между java-версиями (возможно, даже между разными компьютерами), но в соответствии с Oracle

В большинстве современных 32-битных систем Windows максимальный размер кучи будет варьироваться от 1,4 ГГ до 1,6 ГБ.

Поэтому для всего, что требует 1,5 ГБ кучи, вам может не повезти на 32-битной JVM (и так на 32-битной ОС).

Вы можете получить дополнительные МБ за счет уменьшения других пулов памяти, например, установив -XX:ReservedCodeCacheSize (по умолчанию 32 м) или -XX:MaxPermSize (по умолчанию 64 м), но это может привести к другим проблемам при запуске приложения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .