Сервлет выдаёт в ответ данные. Это метрики. В процессе генерится некоторое количество мусора. Больше метрик - больше мусора. GC (CMS) прибирает.
Ожидание: GC прибирает мусор, всё в шоколаде.
Реальность: Падаем с OutOfMemoryError.
Анализирю heap dump - вижу, что ну реально мусор. Объекты лежат в массиве, массив в ArrayList, ArrayList корень.
Попробовал в дебаге локально попросить у машины System.gc() - убедился, что это реально мусор, он правда прибирается.
Вопрос: Что проще ?
а) затюнить GC
б) дать памяти побольше
в) иной вариант
Вариант г) "перепилить сервлет" не очень приемлим, там просто вызов третьесторонней либы и всё.
GC Overhead limit exceeded? Ну таки да, тюнить ГЦ (включая возможно дать ему больше памяти) может young generation увеличить, чтобы в CMS мусор вообще не доползал. verbose gc в помощь.
Можно сделать, как все мы любим. Костылями: https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html :D
Обсуждают сегодня