Есть ли руководство по поваренной книге для проблем GC?
Почти все в конечном итоге сталкиваются с проблемами GC с Java.
Существует ли руководство по кулинарной книге или полуавтоматический инструмент для настройки GC для Java?
Мое обоснование таково:
- Почти у всех в конце концов есть эти проблемы
- Есть много возможных факторов (скажем, 20), из которых только несколько влияют на вашу проблему.
- Большинство людей не знают, как определить ключевые факторы, поэтому настройка GC больше похожа на черное искусство, чем на науку.
- Не все используют HotSpot VM. Различные версии Sun имеют разные характеристики GC.
- Нет стимула экспериментировать (например, запускать виртуальную машину с немного разными настройками каждый день, чтобы посмотреть, как они работают).
Таким образом, вопрос на самом деле: есть ли что-то, что я могу использовать в виде контрольного списка? Или, может быть, даже инструмент, который анализирует журналы GC или дампы кучи и дает мне конкретные подсказки, где искать (вместо того, чтобы сказать мне, что "95% данных размещается в объектах типа byte[]", что в принципе бесполезно).
Смежные вопросы:
- Подходящие параметры запуска Tomcat 5.5 для настройки JVM для чрезвычайно высокого требования, веб-приложение с большой кучей? что очень специфично. У меня вопрос более широкий.
- Каковы наилучшие настройки сборки мусора на стороне клиента? Опять очень узкая сфера
- Кто-нибудь знает хорошее руководство по настройке GC в Java? Только HotSpot
- JVM управления памятью и сборщик мусора? там 80%, но мне не хватает подхода контрольный список / поваренная книга / для чайников.
2 ответа
Ссылки на различную информацию GC:
оракул
Настройка сборки мусора с помощью виртуальной машины Java [tm] 5.0
и это тоже
Java SE 6 HotSpot[tm] Настройка сборки мусора виртуальной машины
IBM
Тонкая настройка сборки мусора [ссылка мертвая]
Расширяемый многословный инструментарий
SAP JVM
Управление памятью (сборка мусора)
Обнаружение зависания / зацикливания виртуальных машин
Анализ ситуаций нехватки памяти
Извините, я мало что знаю о SAP, но предоставил кое-что, что нашел.
Что касается кулинарной книги, то, скорее всего, настройка - это конкретное приложение на этом уровне, но это интересная тема.
ДОПОЛНЕНИЕ
Вы также упомянули инструменты анализа. Некоторые кандидаты перечислены здесь:
Знаете какие-либо инструменты анализа журналов сборки мусора Java?
Из различных ресурсов я составил контрольный список работоспособности, который я использую для анализа поведения GC и производительности моих приложений. Эти рекомендации являются общими и применимы к любой JVM, зависящей от поставщика, но содержат также информацию, относящуюся к HotspotVM, для иллюстрации.
Отключить явный сборщик мусора. Явный GC - плохая практика кодирования, она никогда не помогает. использование
-XX:+DisableExplicitGC
,Включить полное ведение журнала 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
Рассмотрим дополнительные способы сбора информации о вашем GC. Ведение журнала хорошо, но иногда доступны легкие инструменты командной строки, которые дадут вам еще больше понимания. Например.
jstat
для Hotspot, которая покажет вам занятие / способность Eden, Survivor и Old Gen.Соберите классовые гистограммы. Они легкие и покажут вам содержимое кучи. Вы можете делать снимки всякий раз, когда замечаете какое-то странное действие GC, или можете делать их до / после Full GC:
- Содержимое пространства OldGen: Вы можете узнать, какие объекты находятся в OldGen. Вам необходимо распечатать гистограммы до и после Full GC. А поскольку коллекция YoungGen выполняется до полной GC, эти гистограммы покажут вам содержимое Старого поколения. использование
-XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC.
- Обнаружение преждевременно продвигаемых объектов. Чтобы определить, будут ли какие-либо экземпляры продвигаться раньше, вам необходимо изучить гистограммы, чтобы увидеть, какие классы должны находиться в OldGen, а какие классы следует видеть только в YoungGen. Это не может быть сделано автоматически, вам нужно подумать о назначении каждого класса и его экземпляра, чтобы определить, является ли объект временным или нет.
- Содержимое пространства OldGen: Вы можете узнать, какие объекты находятся в OldGen. Вам необходимо распечатать гистограммы до и после Full GC. А поскольку коллекция YoungGen выполняется до полной GC, эти гистограммы покажут вам содержимое Старого поколения. использование
Рассмотрим другой алгоритм GC. Виртуальные машины обычно поставляются с несколькими различными реализациями GC, которые обеспечивают различные компромиссы: пропускную способность, занимаемую площадь, без пауз / коротких пауз, в режиме реального времени и т. Д. Рассмотрите варианты, которые у вас есть, и выберите тот, который соответствует вашим потребностям.
Остерегайтесь финализировать (). Убедитесь, что GC идет в ногу с классами, используя
finalize()
, Выполнение этого метода может быть довольно дорогостоящим, и это может повлиять на GC и пропускную способность приложения.Кучи свалок. Это первый шаг, который имеет большой вес и повлияет на работающее приложение. Соберите дамп кучи для дальнейшего изучения содержимого кучи или для подтверждения гипотезы, наблюдаемой на шаге 4.
Используемые ресурсы:
Книги:
- Java Performance - практическое руководство
- Справочник по сборке мусора - теория объяснила
Переговоры / Статьи:
- Java One 2012 Advanced JVM Tuning
- Из кода Java в кучу Java
- Настройка производительности сборщика мусора Java One 2012 G1
- Руководство по настройке сборки мусора
Списки рассылки: