Кто-нибудь нашел настройку сборки мусора полезной?

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

Я всегда избегал настройки там, где это было возможно, и сосредоточился на написании как можно более простого кода (совет Брайана Гетца) - до сих пор это, кажется, хорошо сработало для меня.

Устойчивы ли эти стратегии настройки к изменениям в разных версиях ВМ или они требуют постоянной переоценки?

Единственная настройка, которую я использовал, - это флаг -server.


person Fortyrunner    schedule 08.03.2009    source источник
comment
Обратите внимание, что флаг -server обычно не нужен, если вы фактически выполняете развертывание на сервере. JVM определит, в какой среде она работает.   -  person oxbow_lakes    schedule 08.03.2009
comment
Это не работает в Windows. Тем не менее, он работает в Linux и Solaris. Большинство компьютеров с Windows превышают требования к стандартному серверу. Предположительно предполагается, что они будут использоваться для использования клиентом.   -  person Fortyrunner    schedule 09.03.2009


Ответы (6)


Часть моей текущей работы - это обслуживание и загрузка большого java-приложения, которое было разработано для работы с большим объемом памяти (в настоящее время около 8 ГБ), в основном из-за текущих вычислений с большим количеством кэшированных данных. Я выполнил первоначальное развертывание со стандартной настройкой сборщика мусора, в основном потому, что не было простого способа смоделировать производственную среду, работающую на полную мощность.

Постепенно, в течение следующих нескольких месяцев, я настраивал параметры GC. Как правило, самая большая доступная ручка, кажется, регулирует частоту и величину приращения gc - самое большое улучшение заключалось в замене большого периодического gc на более мелкие и более частые. Но мы определенно смогли увидеть улучшения производительности.

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

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

Вот хорошая ссылка из пред. обсуждение stackoverflow.

person Steve B.    schedule 08.03.2009

Подавляющему большинству разработчиков никогда не придется (и не захочет) настраивать сборщик мусора. Я работал с людьми, которым приходилось настраивать его, и вот совет:

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

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

Однажды я помог кому-то с проблемой GC, которая, как оказалось, заключалась в том, что они не закрывали наборы результатов JDBC (или какую-то подобную проблему). Это привело к тому, что память никогда не освободилась (его код почему-то удерживал их). После устранения этой проблемы программа увеличилась с 20 минут до примерно 30 секунд или пары минут. Использование памяти также сильно снизилось.

person TofuBeer    schedule 08.03.2009
comment
Вот что меня беспокоит. Любые стратегии настройки необходимо будет проверять всякий раз, когда происходит выпуск JVM, и даже через определенные промежутки времени на протяжении всего цикла разработки - вот почему я избегаю настройки. - person Fortyrunner; 09.03.2009
comment
Виртуальная машина нестабильна, они вносят изменения / улучшения в сборку мусора с каждым выпуском, поэтому даже городские легенды об улучшении производительности, скорее всего, окажутся неверными к тому времени, когда вы их услышите ... всегда пишите код чистым, и я, вероятно, буду достаточно быстро, если не будет легче ускорить это. - person TofuBeer; 09.03.2009

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

Я полагаю, что ответ таков: если задержка критична для приложения, вам может потребоваться настройка вашего GC

person oxbow_lakes    schedule 08.03.2009

Я бы сказал, что чаще всего настраивается максимальный объем памяти. Большинство других опций памяти имеют разумные значения по умолчанию и часто переналаживаются ИМХО. т.е. установите, когда это действительно не имеет большого значения. Я часто вижу, как люди задают множество параметров, хотя половина из них в любом случае используется по умолчанию. ;)

Использование профилировщика - наиболее полезный способ улучшить поведение сборщика мусора (за счет уменьшения количества создаваемых объектов).

person Peter Lawrey    schedule 08.03.2009
comment
Я не уверен, что большинство людей увидят настройку параметра Xmx как настройку GC. - person oxbow_lakes; 08.03.2009
comment
Я немного не согласен. Если у вас занят ящик и вы выделяете слишком много памяти, это может привести к тому, что ящик будет слишком много менять память. - person Fortyrunner; 09.03.2009
comment
Хорошие моменты: использование -mx не может считаться настройкой сборщика мусора, но часто это единственное, что вам нужно сделать правильно. Как указывает @Fortyrunner, вы не хотите, чтобы он был слишком большим или слишком маленьким. Я обнаружил, что вы не хотите, чтобы JVM использовала более одного банка памяти, если вы можете помочь. - person Peter Lawrey; 09.03.2009

У меня есть, но не в последнее время. Приложение, над которым я работал, представляло собой рендеринг в реальном времени видеопотока, состоящего из отдельных изображений в формате JPEG. В то время (около JDK 1.2 и 1.3) параметр -Xincgc переключал клиентский сборщик мусора из режима большой очистки в режим, в котором небольшая часть мусора очищалась регулярно. В результате распределение задержек кадров было намного меньше, создавая впечатление более плавного видео (вместо 1-2-3-пауз, 1-2-3-пауз).

Я не смотрел этот код довольно долгое время, но сильно подозреваю, что с современными алгоритмами сборки мусора -Xincgc фактически снизит производительность.

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

person Bob Cross    schedule 08.03.2009
comment
Это, вероятно, снижает общую производительность, но все же может значительно улучшить задержку. Например, подсчет ссылок C ++ shared_ptr может быть медленнее, чем Java GC, но общий эффект намного более плавный. - person Zan Lynx; 13.10.2010
comment
@Zan, я не думаю, что понимаю ваш комментарий. Я говорил, что -Xincgc теперь слишком наивен. У современного GC больше полезных опций. Я бы даже не сделал вывод, что -Xincgc приведет к более плавным задержкам без тестирования. - person Bob Cross; 13.10.2010
comment
Суть моего комментария заключалась в том, что выполнение непрерывных небольших чисток может привести к увеличению времени работы приложения, но его будет приятнее использовать (если приложение интерактивно для пользователя). - person Zan Lynx; 13.10.2010
comment
@Zan, да, это определенно правда. Тем не менее, я думаю, что с современными алгоритмами GC вы найдете более плавную производительность, которая работает быстрее, чем старый -Xincgc. - person Bob Cross; 13.10.2010

Короче говоря, да, это очень полезно для настройки любого серьезного Java-приложения. Мы часто обнаруживаем, что в производственных сценариях разница между стабильным приложением и совершенно непредсказуемым приложением. Это, конечно, не первое, что я делаю, но как только у вас есть работающее приложение и вы можете прикладывать к нему реальную нагрузку, это одно из первых, что нужно исследовать на этом этапе.

person Alex Miller    schedule 08.03.2009