Есть ли руководство по поваренной книге для проблем с GC?
Почти все в конечном итоге сталкиваются с проблемами GC с Java.
Есть ли руководство по кулинарной книге или полуавтоматический инструмент для настройки GC для Java?
Мое объяснение таково:
- Почти у всех в конце концов есть эти проблемы.
- Существует много возможных факторов (скажем, 20), из которых лишь некоторые из них влияют на вашу проблему.
- Большинство людей не знают, как определить ключевые факторы, поэтому настройка GC больше похожа на черное искусство, чем на науку.
- Не все используют виртуальную машину HotSpot. Различные версии Sun имеют разные характеристики GC.
- Существует мало стимулов для экспериментов (например, запускать виртуальную машину с немного разными настройками каждый день, чтобы увидеть, как они проигрываются).
Итак, на самом деле вопрос: есть ли что-то, что я могу использовать в контрольном списке? Или, может быть, даже инструмент, который анализирует GC-журналы или кучи дампов и дает мне конкретные подсказки, где искать (вместо того, чтобы говорить мне "95% данных выделяется в объектах типа byte []", что в основном бесполезно).
Похожие вопросы:
Ответы
Ответ 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.
Используемые ресурсы:
Книги:
Переговоры/Статьи:
Списки рассылки: