Подтвердить что ты не робот

Как выбрать размер кучи jvm?

То, что я обычно делаю относительно размера кучи jvm, устанавливает максимальное значение на самом деле, чтобы избежать печально известного OutOfMemoryException.

Однако эта стратегия (или отсутствие стратегии) ​​не кажется действительно умной.: -).

Мой вопрос в том, как выбрать значения min и max, а также разницу между ними (должен ли max-min быть маленьким или большим?). Например, из здесь:

если начальная куча слишком мала, Запуск приложения Java замедляется поскольку JVM вынуждена выполнять сбор мусора часто до тех пор, пока куча выросла до более разумный размер. Для оптимального запуска вы должны установить начальную размер кучи до максимума размер кучи.

спасибо.

4b9b3361

Ответ 1

Мой вопрос - как выбрать мин. и максимальные значения, а разность между ними (если max-min маленький или большой?)

Короткий ответ: не угадывайте, профиль вашего приложения.

jconsole может предоставить вам полезные данные высокого уровня, например, ощущение для основного резидентного набора по сравнению с временными данными, которые мы обычно выделяем, и сбор мусора. То, что вы увидите, если вы посмотрите на вкладку памяти этого дисплея, как правило, похоже на пилообразную. Нижний угол пилы - это то место, где я обычно устанавливал минимальный уровень кучи, тогда как я использовал пик или наклон пилы для экспериментов с максимумом кучи. Если ваши зубы очень крутые, вы можете подумать о большой куче, чтобы просто отложить сборку мусора. Однако, если это не так, вы можете попробовать меньший максимум кучи, чтобы увидеть, может ли это оставить больше ресурсов для других процессов на вашем компьютере (например).

Вы также должны рассмотреть серверную VM, поскольку это приведет к поведению различных сборов мусора.

Все сказанное, вы также должны использовать более подробный инструмент, например jvisualvm, чтобы профилировать использование вашего процесса в памяти. Возможно, у вас есть утечка памяти или жадный распределитель, который вы можете настроить или устранить. Это полностью изменит ваши потребности в куче.

Ответ 2

Вы должны включить GC-журнал и проверить, где находится OOM.

-verbose:gc
-Xloggc:gc.log  
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails

Возможно, вы столкнулись с ограничениями в пространстве, отрегулируйте с помощью -XX:MaxPermSize=YYYm

В любом случае, чтобы ответить на ваш вопрос, я начинаю без минимумов и устанавливаю максимально высокий уровень. Затем я рисую gc log и узнаю, где мое состояние состояния; визуально выберите средний размер для разных поколений. Прочтите это как финансовую диаграмму, вы захотите увидеть хорошее распространение в новых поколениях и последовательный рост и сбор в поколении. Как упоминалось, также нарисуйте свое пространство perm, чтобы вы не постоянно увеличивались.

GC tuning - это искусство, ни в коем случае не наука.

Ответ 3

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

Тем не менее, нет общего ответа на ваш вопрос, у каждого приложения разные потребности. Фактически, я предлагаю профилировать ваше приложение и настраивать кучу, чтобы найти хороший компромисс между (основной) частотой GC и (майор) продолжительностью GC, минимизируя время отклика для конечного пользователя. Я горячо предлагаю прочитать более подробное сообщение в блоге (и все остальные) от Кирка Пеппердина для более подробной информации.

Чтобы ответить на часть min и max value, я всегда использую те же самые значения (для улучшения производительности запуска и лучшей воспроизводимости).

Ответ 4

Правильный ответ: нет правильного ответа. Каждый проект отличается, и вам нужно будет точно настроить конфигурацию размера кучи на основе каждого проекта. Я начал бы медленно и постепенно увеличивал размер кучи до тех пор, пока ваше приложение не будет работать по назначению.

Вы правы, установка огромного максимального значения - не очень хорошая идея.

Ответ 5

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

У Джеффа Этвуда есть хорошая статья о CodingHorror, которая объясняет это отношение; наиболее экономичным решением проблемы производительности является перетащить аппаратное обеспечение (или, в данном случае, увеличенные ресурсы памяти) в проблему, прежде чем инвестировать время разработчика в устранение неполадок:

http://www.codinghorror.com/blog/archives/001198.html

Ответ 6

Очень плохо "игнорировать параметр -Xms", так как обычно есть другие приложения и процессы, запущенные в одном окне. Вы хотите, чтобы ваше приложение запускалось с максимальным объемом выделенной ОЗУ, поэтому, если он терпит неудачу, он терпит неудачу, пока вы смотрите журналы запуска, а не в 4:00, когда другое приложение заняло дополнительную оперативную память на ящике, и ваша JVM не может расти в размерах.

Короче говоря, ВСЕГДА устанавливаем минимальный размер JVM и размер смешивания с тем же значением.