SlavikF
@SlavikF

Как удалить объекты в Java, чтобы в TestNG не словить OutOfMemory?

Да я знаю, что в Java объекты нельзя удалить вручную - сборщик мусора работает так, как захочет. Вопрос не про это.

Есть тесты с TestNG.
Один из этих тестов делает два скриншота и сравнивает, насколько они похожи.
Этот тест повторяется около 50 раз для разных веб-сайтов, но уже где-то на 20м вылетает с OutOfMemory.
При отладке выяснилось, что org.testng.Reporter при каждом assert (или при каждом тесте) полностью логирует все properties объекта теста, в котором есть эти два скриншота, которые занимают много места.
Сами скриншоты записываются на диск, и в org.testng.Reporter не нужны, но как сделать так, чтобы они туда не попадали?

Я пробовал вот так, но они всё равно попадают в org.testng.Reporter, который висит в памяти и до последнего не сбрасывается на диск:
frameImg = takeEmbeddedScreenshot()
actualImg = takeActualScreenshot(url)
boolean compareRes = compareScreenShots(frameImg, actualImg, "build/screenshots/proxy")

frameImg = null
actualImg = null
System.gc ()

assert compareRes, "Too many differences between the two panes, this URL fails: ${url}"
  • Вопрос задан
  • 2379 просмотров
Пригласить эксперта
Ответы на вопрос 2
leventov
@leventov
Пример утечки памяти в Java. Понятия не имею, как устроен TestNG и можно ли его подхачить, но, думаю, самым простым решением будет изменить скриншотные функции, чтобы они переиспользовали объекты, либо, если это тоже сложно, перед сравнением перекопировать скриншоты в два буффера, которые сделать полями тестового класса, (ByteBuffer, или во что будет проще скопировать байты скриншота), и сравнивать уже их. Тогда TestNG будет логгировать ссылки на два объекта, одних и тех же все время, а новые скриншоты будут собираться сборщиком мусора.
Ответ написан
Комментировать
SlavikF
@SlavikF Автор вопроса
Не, на самом деле никакой утечки здесь нет. Это такой (кривой) дизайн: идея я так понимаю в том, чтобы записать как можно больше данных, чтобы можно было дебаггить пост-факт.

По поводу двух буфферов: их и так только два и в них же каждый раз всё и перезаписывается. Дело в том, что TestNG запускает один и тот же тест много раз, только с разными данными. И даже если ссылки остаются те же, то он всё равно их скопирует ещё раз.

51b3de820010458dbea7f0188fd1988f.png
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
22 апр. 2024, в 16:15
20000 руб./за проект
28 апр. 2024, в 19:13
1000 руб./в час