Динамическая установка максимального размера кучи для процесса Java - PullRequest
3 голосов
/ 08 марта 2010

У меня есть Java-программа, которая запускается командным файлом со строкой, подобной этой:

javaw -Xms64m -Xmx1024m com.acme.MyProgram

Однако на некоторых компьютерах программа не запускается и отображает следующее сообщение:

Не удалось зарезервировать достаточно места для кучи объектов. Не удалось создать виртуальную машину Java.

Кажется, проблема в том, что максимальный размер пула выделения памяти больше, чем может обработать компьютер. Уменьшение максимального размера пула выделения памяти с 1024 м до 512 м, похоже, решает проблему.

Есть ли способ, которым я могу заранее определить, сколько памяти доступно на компьютере (из пакетного файла) и определить, использовать ли -Xmx1024m или -Xmx512m в вызове пакетного файла? Обратите внимание, что этот пакетный файл должен работать только в Windows.

Ответы [ 4 ]

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

На самом деле Java VM уже делает нечто подобное. Если вы не укажете -Xms или -Xmx, то эти значения будут выведены из объема физической памяти на машине. Или, по крайней мере, так говорит эта страница .

Вы можете установить -Xms на минимальный размер кучи, что делает ваше приложение полезным, и позволить Java определить правильное значение для -Xmx.

1 голос
/ 09 марта 2010

Вы можете взглянуть на эту страницу, чтобы найти ответы на некоторые вопросы: Получить JVM для увеличения потребности в памяти при необходимости до размера ограничения виртуальной машины?

0 голосов
/ 08 марта 2010

Вы можете выполнить из своего пакетного файла, проверить уровень ошибок при выходе и перезапустить на более низкой памяти, если это не удалось. Я не уверен, что уровень ошибок сработает - если этого не произойдет, вы также можете проверить, сколько времени потребовалось для выполнения программы ... любая вещь менее чем за 10 секунд будет дешевой.

Только пара комментариев -

Если вы знаете, что НЕ НУЖНО больше 512, вам следует запустить тест, чтобы убедиться, что 1024 действительно помогает. Большие кучи часто могут сделать ваши паузы в GC длиннее и больше ничего не делать.

Если вы почти уверены, что будете использовать определенное количество оперативной памяти (скажем, куча легко заполнит 512, которые вы выделяете), вам, вероятно, следует установить min для этого числа. Установка минимального и максимального значения на 512 хорошо, если ваша программа выделяет кучу вещей, но не ситуативна (всегда использует примерно одинаковое количество оперативной памяти)

0 голосов
/ 08 марта 2010

Если ваша программа работает правильно с максимальной кучей 512 м, я бы использовал это значение.

При этом я также проверю, есть ли способ сделать то, что вы спрашиваете, поскольку это интересный вопрос.

...