java .lang.OutOfMemoryError: G C превышен предел накладных расходов при нагрузочном тестировании Jmeter - PullRequest
0 голосов
/ 22 апреля 2020

Я выполнял нагрузочное тестирование Jmeter для приложения с весенней загрузкой (Java 8), где я запустил 50 одновременных запросов и выделил размер кучи равным 6 ГБ. Во время тестирования я обнаружил

java .lang.OutOfMemoryError: G C превышен лимит накладных расходов

Согласно Java документам,

по умолчанию JVM настроен на выдачу этой ошибки, если процесс Java тратит более 98% своего времени на выполнение G C и когда при каждом запуске восстанавливается только менее 2% кучи.

После этой ошибки приложение стало очень медленным, что является ожидаемым поведением. Я проверил на возможные утечки памяти, но их не было. Я хочу знать, как и когда сборщик мусора освободит занятую память неудавшихся запросов?

Например, если я снова запущу комплект тестов с 20 одновременными запросами, сможет ли мое приложение обслуживать эти запросы освобождая память предыдущего запуска или мне нужно перезапустить приложение?

Добавление нескольких деталей приложения:

  • Приложение извлекает около 50–200 тыс. строк из таблиц (с 30 столбцами). ) за запрос
  • Ожидалось, что во время тестирования возникнет нехватка памяти, чтобы найти число строк, которые можно извлечь за запрос

Меня беспокоит, как будет работать мое приложение, если эта ошибка приходит в производство. Сможет ли он обслуживать будущие запросы с той же скоростью, или мне придется перезапустить мое приложение?

1 Ответ

0 голосов
/ 22 апреля 2020

Java несчастен из-за высокого уровня G C, что свидетельствует о серьезной проблеме. Однако это может быть законным из-за высокого уровня оттока объектов или сложных циклических отношений, которые заставляют G C тратить больше времени на определение мертвого объекта. Это также не поможет вам точно определить, где происходит утечка (если она происходит).

Когда эта ошибка возникает при тестировании, первое, что я делаю, это отключаю эту ошибку. Это можно сделать с помощью флага -XX:-UseGCOverheadLimit JVM. Это позволит G C продолжить работу и будет лучше освещать любые «настоящие» проблемы с памятью.

...