Задать вопрос
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}"
  • Вопрос задан
  • 2383 просмотра
Подписаться 2 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
leventov
@leventov
Пример утечки памяти в Java. Понятия не имею, как устроен TestNG и можно ли его подхачить, но, думаю, самым простым решением будет изменить скриншотные функции, чтобы они переиспользовали объекты, либо, если это тоже сложно, перед сравнением перекопировать скриншоты в два буффера, которые сделать полями тестового класса, (ByteBuffer, или во что будет проще скопировать байты скриншота), и сравнивать уже их. Тогда TestNG будет логгировать ссылки на два объекта, одних и тех же все время, а новые скриншоты будут собираться сборщиком мусора.
Ответ написан
Комментировать
SlavikF
@SlavikF Автор вопроса
Не, на самом деле никакой утечки здесь нет. Это такой (кривой) дизайн: идея я так понимаю в том, чтобы записать как можно больше данных, чтобы можно было дебаггить пост-факт.

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

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

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

Похожие вопросы
Сбер Москва
от 300 000 до 350 000 ₽
DIGITAL SECTOR Краснодар
от 250 000 до 450 000 ₽
Сбер Санкт-Петербург
До 350 000 ₽