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
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы