Есть ли руководство по поваренной книге для проблем GC?

Почти все в конечном итоге сталкиваются с проблемами GC с Java.

Существует ли руководство по кулинарной книге или полуавтоматический инструмент для настройки GC для Java?

Мое обоснование таково:

  • Почти у всех в конце концов есть эти проблемы
  • Есть много возможных факторов (скажем, 20), из которых только несколько влияют на вашу проблему.
  • Большинство людей не знают, как определить ключевые факторы, поэтому настройка GC больше похожа на черное искусство, чем на науку.
  • Не все используют HotSpot VM. Различные версии Sun имеют разные характеристики GC.
  • Нет стимула экспериментировать (например, запускать виртуальную машину с немного разными настройками каждый день, чтобы посмотреть, как они работают).

Таким образом, вопрос на самом деле: есть ли что-то, что я могу использовать в виде контрольного списка? Или, может быть, даже инструмент, который анализирует журналы GC или дампы кучи и дает мне конкретные подсказки, где искать (вместо того, чтобы сказать мне, что "95% данных размещается в объектах типа byte[]", что в принципе бесполезно).

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

2 ответа

Решение

Ссылки на различную информацию GC:

оракул

Настройка сборки мусора с помощью виртуальной машины Java [tm] 5.0

и это тоже

Java SE 6 HotSpot[tm] Настройка сборки мусора виртуальной машины

IBM

Тонкая настройка сборки мусора [ссылка мертвая]

Расширяемый многословный инструментарий

SAP JVM

Управление памятью (сборка мусора)

Обнаружение утечек памяти

Обнаружение зависания / зацикливания виртуальных машин

Анализ ситуаций нехватки памяти

Извините, я мало что знаю о SAP, но предоставил кое-что, что нашел.

Что касается кулинарной книги, то, скорее всего, настройка - это конкретное приложение на этом уровне, но это интересная тема.

ДОПОЛНЕНИЕ

Вы также упомянули инструменты анализа. Некоторые кандидаты перечислены здесь:

Знаете какие-либо инструменты анализа журналов сборки мусора Java?

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

  1. Отключить явный сборщик мусора. Явный GC - плохая практика кодирования, она никогда не помогает. использование -XX:+DisableExplicitGC,

  2. Включить полное ведение журнала GC. Легкий, но мощный.

    • Вычислить живой набор данных, скорость распределения и скорость продвижения. Это скажет вам, если вам нужна большая куча или если ваш например. Young Gen слишком маленький, или если пространство в Survivor переполнено и т. Д.
    • Вычислите общее время GC, оно должно быть <5% от общего времени работы.
    • использование -XX:+PrintTenuringDistribution -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion
  3. Рассмотрим дополнительные способы сбора информации о вашем GC. Ведение журнала хорошо, но иногда доступны легкие инструменты командной строки, которые дадут вам еще больше понимания. Например. jstat для Hotspot, которая покажет вам занятие / способность Eden, Survivor и Old Gen.

  4. Соберите классовые гистограммы. Они легкие и покажут вам содержимое кучи. Вы можете делать снимки всякий раз, когда замечаете какое-то странное действие GC, или можете делать их до / после Full GC:

    • Содержимое пространства OldGen: Вы можете узнать, какие объекты находятся в OldGen. Вам необходимо распечатать гистограммы до и после Full GC. А поскольку коллекция YoungGen выполняется до полной GC, эти гистограммы покажут вам содержимое Старого поколения. использование -XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC.
    • Обнаружение преждевременно продвигаемых объектов. Чтобы определить, будут ли какие-либо экземпляры продвигаться раньше, вам необходимо изучить гистограммы, чтобы увидеть, какие классы должны находиться в OldGen, а какие классы следует видеть только в YoungGen. Это не может быть сделано автоматически, вам нужно подумать о назначении каждого класса и его экземпляра, чтобы определить, является ли объект временным или нет.
  5. Рассмотрим другой алгоритм GC. Виртуальные машины обычно поставляются с несколькими различными реализациями GC, которые обеспечивают различные компромиссы: пропускную способность, занимаемую площадь, без пауз / коротких пауз, в режиме реального времени и т. Д. Рассмотрите варианты, которые у вас есть, и выберите тот, который соответствует вашим потребностям.

  6. Остерегайтесь финализировать (). Убедитесь, что GC идет в ногу с классами, используя finalize(), Выполнение этого метода может быть довольно дорогостоящим, и это может повлиять на GC и пропускную способность приложения.

  7. Кучи свалок. Это первый шаг, который имеет большой вес и повлияет на работающее приложение. Соберите дамп кучи для дальнейшего изучения содержимого кучи или для подтверждения гипотезы, наблюдаемой на шаге 4.

Используемые ресурсы:

Книги:

Переговоры / Статьи:

Списки рассылки:

Другие вопросы по тегам