Из различных ресурсов я составил контрольный список работоспособности , который я использую для анализа поведения GC и производительности моих приложений. Эти рекомендации являются общими и применяются к любой JVM, зависящей от поставщика, но содержат также информацию, относящуюся к HotspotVM, для иллюстрации.
Отключить явный GC .Явный GC - плохая практика кодирования, она никогда не помогает.Используйте -XX:+DisableExplicitGC
.
Включить полное ведение журнала ГХ .Легкий, но мощный.
- Вычислить Набор данных в реальном времени , Скорость распределения и Скорость повышения .Это скажет вам, если вам нужна большая куча или если ваш например.Young Gen слишком маленький, или если пространство Survivor переполнено и т. Д.
- Вычислить общее время GC , оно должно составлять <5% от общего времени работы.</li>
- Использование
-XX:+PrintTenuringDistribution -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion
Рассмотреть дополнительные способы сбора информации о вашем GC .Ведение журнала - это хорошо, но иногда доступны легковесные инструменты командной строки, которые помогут вам лучше понять.Например.jstat
для Горячей точки, которая покажет вам занятие / вместимость Эдема, Выжившего и Старого Генерала.
Соберите гистограммы классов Это легкий вес и покажет вам содержимоекучи.Вы можете делать снимки всякий раз, когда замечаете какие-то странные действия GC, или вы можете делать их до / после полного GC: * 1048 *
- Содержимое пространства OldGen : Вы можете узнать, какие объектыпроживать в OldGen.Вам необходимо распечатать гистограммы до и после Full GC.А поскольку коллекция YoungGen выполняется до полной GC, эти гистограммы покажут вам содержимое Старого поколения.Используйте
-XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC.
- Обнаружение преждевременно продвинутых объектов : Чтобы определить, будут ли какие-либо экземпляры продвигаться раньше, вам нужно изучить гистограммы, чтобы увидеть, какие классы должны находиться в OldGen, а какие классыследует видеть только в YoungGen.Это не может быть сделано автоматически, вам нужно подумать о назначении каждого класса и его экземпляра, чтобы определить, является ли объект временным или нет.
Рассмотрим различные GCАлгоритм .Виртуальные машины обычно поставляются с несколькими различными реализациями GC, которые обеспечивают различные компромиссы: пропускную способность, занимаемую площадь, без пауз / коротких пауз, в режиме реального времени и т. Д. Рассмотрите варианты, которые у вас есть, и выберите тот, который соответствует вашим потребностям.
Остерегайтесь завершения () .Убедитесь, что GC идет в ногу с классами, используя finalize()
.Выполнение этого метода может быть довольно дорогостоящим, и это может повлиять на ГХ и пропускную способность приложения.
Дампы кучи. Это первый шаг, который имеет большой вес и повлияет назапущенное приложение.Соберите дамп кучи для дальнейшего изучения содержимого кучи или для подтверждения гипотезы, наблюдаемой на шаге 4.
Использованные ресурсы:
Книги:
Доклады / статьи:
Списки рассылки: