Я выполнял нагрузочное тестирование Jmeter для приложения с весенней загрузкой (Java 8), где я запустил 50 одновременных запросов и выделил размер кучи равным 6 ГБ. Во время тестирования я обнаружил
java .lang.OutOfMemoryError: G C превышен лимит накладных расходов
Согласно Java документам,
по умолчанию JVM настроен на выдачу этой ошибки, если процесс Java тратит более 98% своего времени на выполнение G C и когда при каждом запуске восстанавливается только менее 2% кучи.
После этой ошибки приложение стало очень медленным, что является ожидаемым поведением. Я проверил на возможные утечки памяти, но их не было. Я хочу знать, как и когда сборщик мусора освободит занятую память неудавшихся запросов?
Например, если я снова запущу комплект тестов с 20 одновременными запросами, сможет ли мое приложение обслуживать эти запросы освобождая память предыдущего запуска или мне нужно перезапустить приложение?
Добавление нескольких деталей приложения:
- Приложение извлекает около 50–200 тыс. строк из таблиц (с 30 столбцами). ) за запрос
- Ожидалось, что во время тестирования возникнет нехватка памяти, чтобы найти число строк, которые можно извлечь за запрос
Меня беспокоит, как будет работать мое приложение, если эта ошибка приходит в производство. Сможет ли он обслуживать будущие запросы с той же скоростью, или мне придется перезапустить мое приложение?