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

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

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

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

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

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

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

Похожие вопросы:

4b9b3361

Ответ 1

Ссылки для различной информации GC:

Oracle

Настройка коллекции мусора с виртуальной машиной 5.0 Java [tm]

и это также

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

IBM

Тонкая настройка коллекции мусора [link dead]

Расширяемый подробный инструментарий

SAP JVM

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

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

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

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

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

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

ДОПОЛНЕНИЕ

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

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

Ответ 2

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

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

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

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

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

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

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

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

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

Книги:

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

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