У меня есть приложение, работающее в java8 и Tomcat 8.5. Я запускаю тесты против него, и я думаю, что есть утечка памяти, как будто я запускаю серию POST (вызовы REST передают данные в БД), я получаю сообщение «java.lang.OutOfMemoryError: Превышен лимит накладных расходов GC». На данный момент я в значительной степени использую все значения по умолчанию. Сообщения, которые я делаю, не огромны, и я оставляю промежуток в 3 секунды между каждым сообщением.
Я заметил, что объем памяти Tomcat JVM по умолчанию довольно мал (126 при запуске с максимальным значением 252). Когда я подключаюсь с помощью jconsole, он показывает, что «PS Old Gen» почти все время максимально загружен, пространство Survivor не сильно перемещается, а пространство Eden поднимается и опускается, но достигает 99% / 100% до появления ошибки. Если я использую tomcat8w.exe, чтобы увеличить объем памяти до 2 ГБ, проблема исчезнет.
Что я пытаюсь понять, так это то, как я выясняю, есть ли утечка памяти или просто системе требуется больше выделенной памяти?
Если моя ошибка вызвана попаданием Eden Space на 100%, это означает, что нет утечки памяти, поскольку это, вероятно, означает, что объекты зависали достаточно долго, чтобы перемещаться вверх по куче, и это должно быть «PS Old Gen» «что заполняет, или это то, что JVM может потерять след объектов, и поэтому они заполняют пространство Eden и никогда не двигаются дальше?