Проблема
У тебя есть сервер в продакшене. Он успешно работает какое-то время. Но ты стал замечать, что
• раз в минуту он уходит в себя на пару секунд
• через неделю работы падает с OutOfMemoryError
• любые другие симптомы, которые намекают на проблемы с утилизацией памяти
Значит пора уже разобраться со своим garbage collector. Тем более, что это совсем не сложно!
План такой
1. Включаем специальные флажки JVM при следующем редеплое, чтобы она писала логи GC
2. Закачиваем логи на специальный бесплатный сайт gceasy.io
3. Анализируем красивый отчет с графиками
Флажки JVM
Нужно найти скрипт / пайплайн CI/CD / админа, который запускает в проде твой java сервер.
Там будет строчка типа такой:
/usr/local/java8/bin/java \
-cp /usr/lib/phones/lib/* \
-showversion -server -Dfile.encoding=UTF-8 \
-Xms8g -Xmx8g \
-XX:-OmitStackTraceInFastThrow \
ru.zen.java.notes.PhonesMain
Скорее всего какие-нибудь флажки у тебя уже включены. Нужно только дописать вот эти:
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:/tmpfs/var/log/phones/gc.log
Что это значит?
Мы просим JVM на каждое событие GC писать коротенький лог в файл /tmpfs/var/log/phones/gc.log (путь стоит заменить на свой).
Влияет ли на перформанс в проде?
По моему опыту - нет.
• сам лог довольно маленький и лаконичный (на каждый GC, он пишет около 30 строчек в файлик на диске)
• на наших серверах при реальной нагрузке 400 запросах/секунду и далеко не оптимальной утилизации памяти через 5 суток работы лог весит около 40 Мб
На всякий случай мы пишем его в tmpfs (это такая эмуляция жесткого диска в памяти), чтобы избежать любого влияния на IO. Но в большинстве случаев это не является необходимостью.
Загрузить логи на gceasy.io
Самое главное:
• это абсолютно бесплатно
• в этих логах нет никакой приватной информации о твоей супер-секретной проприетарной системе
• если все еще боишься, посмотри список известных компаний, которые его используют на лендинге
Тут всё просто:
1. Выкачиваем с продовой тачки файлик /tmpfs/var/log/phones/gc.log
2. И загружаем на сайт
Анализ отчета
Тут будут всякие слова типа Young Gen, Old GC, GC pause, Heap. В них может быть поможет разобраться моя предыдущая записочка:
Java GC: Mark-Sweep-Compact и поколениия
Примеры секций отчета:
Вывод
Анализировать работу GC просто, бесплатно и весело! Попробуй сейчас. Если не получится, рассказывай в комментах ;)