2009-10-30 4 views
22

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

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

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

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

спасибо.

ответ

18

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

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

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

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

Все, что сказано, вы также должны использовать более подробный инструмент, такой как jvisualvm to profile the memory usage of your process. Возможно, у вас есть утечка памяти или жадный распределитель, который вы можете настроить или устранить. Это полностью изменит ваши потребности в куче.

+0

Спасибо за все ссылки – LB40

+1

@ LB, без проблем. Я буквально использую эти инструменты каждый день. Цитирую себя: «Они не сосут». ;-) –

2

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

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

+0

и есть ли какие-либо отношения между минимальным и максимальным размером? Или минимальный размер кучи совершенно неактуальен? – LB40

+0

Минимум * * неактуальен, конечно, если вы гарантируете, что имеется достаточная физическая память, так что требования JVM к максимальному размеру кучи всегда могут быть размещены.Я бы сказал, установил минимальный размер такого размера кучи, который вы ожидаете при нормальной работе (во избежание неоднократного его изменения при запуске), а max должен отражать «буферную зону» над этим. –

+0

Я не пытаюсь и дважды предполагаю OS/kernel. Я должен предположить, что они хорошо справляются с распределением памяти, лично никогда не видели вредной проблемы с изменением размера JVM, и я почти полностью игнорирую параметр -Xms. – Xailor

5

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

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

Вы можете испытывать пределы пространства проницаемости, регулировать с помощью -XX:MaxPermSize=YYYm

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

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

+2

«GC tuning - это искусство, ни в коем случае не наука». Epic, я собираюсь процитировать вас ... – LB40

2

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

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

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

3

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

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

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

+0

Проблема в том, что область моего приложения зависит от ввода. Таким образом, профилирование является довольно сложным – LB40

+0

@LB в любом данном приложении (той же кодовой базе), профиль использования может быть значительно иным. Я должен консультировать всех своих клиентов в условиях пост-живого для настройки JVM как часть большей фазы профилирования и оптимизации, поскольку он изменяет клиент-клиент, пользователи по-пользователям. – Xailor

+0

Почему, я не понимаю? Что вводит пользователь для 80% пользователей? –

2

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

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

Смежные вопросы