Эргономика Java: как рассчитываются значения по умолчанию?

Я отслеживаю этот вопрос и обнаруживаю, что все информация устарела.

Похоже, самое последнее руководство быть этот документ относительно настройки GC. В нем Oracle определяет свой глупый термин «эргономика», который, я думаю, просто означает разумные («удобные») значения по умолчанию. В этом документе данный документ упоминается, который широко цитируется в приведенном выше вопросе SO.

Он утверждает, что максимальный размер кучи рассчитывается следующим образом:

Меньше 1/4 физической памяти или 1 ГБ. До J2SE 5.0 максимальный размер кучи по умолчанию составлял 64 МБ. Вы можете переопределить это значение по умолчанию, используя параметр командной строки -Xmx.

Это явно неверно, поскольку у меня есть машина, на которой я тестировал, с 12 ГБ ОЗУ и 4096 МБ, что подтверждено с помощью java -XX:+PrintFlagsFinal -version | grep HeapSize. Но оговорка включена:

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

Это здорово! За исключением того, что я не могу найти никакой актуальной документации по этому вопросу. Я подтвердил, что использую серверный класс по этому вопросу. Почему это важно? Потому что на моем сервере класса 12 ГБ по умолчанию установлено 170 МБ. Из-за этого все ломается. Да, я знаю, что могу переопределить это. Мне бы не хотелось дублировать это переопределение в каждом приложении, которое я запускаю, и я бы не хотел жестко закодировать его в файлы pom. Более того, это число каким-то образом случайно изменилось на моей машине, и мне нужно понять, как оно произошло.

Вот моя версия Java:

$ java -version
java version "1.7.0_04"
Java(TM) SE Runtime Environment (build 1.7.0_04-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)

У меня Mac OS X 10.9.2.


person djechlin    schedule 05.05.2014    source источник
comment
@ElliottFrisch хорошая мысль, добавлено   -  person djechlin    schedule 06.05.2014
comment
@ElliottFrisch Хорошо, в этом документе нет ничего полезного.   -  person djechlin    schedule 06.05.2014
comment
Каждый java tomcat/eclipse/etc, который мне приходилось запускать, я захожу и либо добавляю -Xmx=2g в конфигурацию самостоятельно, либо устанавливаю его в JAVA_OPTS. Небольшая цена за душевное спокойствие   -  person Totoro    schedule 06.05.2014


Ответы (1)


Ты прав. Документация по управлению памятью в Java устарела и не является полной: Xmx — лишь один пример.

Я сделал то же наблюдение и изменил СВОЁ поведение: я всегда указываю Xmx.

На мой взгляд, это не проблема. Память, требуемая вашей Java-программе, не должна зависеть от вашего оборудования. Более того, я думаю, что это хорошая практика: явно указывать Xmx (и другие настройки) в ваших скриптах/рецептах, чтобы иметь одинаковое поведение во всех средах (dev/prod часто имеют разные аппаратные конфигурации)

person mcoolive    schedule 22.05.2014