Это сообщение об ошибке ...
java.lang.OutOfMemoryError: unable to create new native thread
... означает, что JVM не удалось создать какой-либо новый собственный поток, так как ваша система запустила OutOfMemory
OutOfMemoryError
Недостаточно памяти Сообщения об ошибках могут появляться при попытке запуска новых программ или при использовании уже запущенных программ, даже если у вас еще много память подкачки доступна. Когда вы запускаете программу java или java, os выделяет часть памяти для JVM. JVM делит эту память на две части. Один из них - Память стека , а другой - Память кучи . Память стека используется для выполнения методов, в то время как Память кучи используется для хранения объектов. Когда куча заполняется, JVM выдает java.lang.OutOfMemoryError
.
java .lang.OutOfMemoryError
java .lang.OutOfMemoryError выбрасывается, когда Куча памяти заполнена, а JVM не может выделить память для новых объектов. Поскольку объекты, которые вы создаете в Java, хранятся в Heap Memory , поэтому, когда объекты больше не нужны, они должны быть удалены из памяти. Сборщик мусора автоматически удаляет ненужные объекты из Кучи памяти . Если ваши объекты имеют живые ссылки, сборщик мусора не удаляет их. Он удаляет только те объекты, которые не имеют живых ссылок. в этом процессе, если в какой-то момент времени не останется места для новых объектов в памяти кучи, JVM сгенерирует java.lang.OutOfMemoryError
.
Этот сценарий использования
Согласно вашему коду В испытаниях вы реализовали многопоточность с использованием ThreadPoolExecutor для создания и использования потока для каждого запроса при открытии google-chrome -headless контекста просмотра.
Многопоточность с использованием Selenium
Как вы упомянули, в течение 1 часа происходит сбой agian с той же ошибкой, я подозреваю, что это связано с тем, что WebDriver не является потокобезопасным . Тем не менее, если вы можете сериализовать доступ к базовому экземпляру драйвера, вы можете поделиться ссылкой более чем в одном потоке. Это не рекомендуется. Но вы всегда можете создать один экземпляр WebDriver для каждого потока.
В идеале проблема thread-safety не в вашем коде, а в реальных привязках браузера. Все они предполагают, что будет только одна команда за раз (например, как настоящий пользователь). Но с другой стороны, вы всегда можете создать один экземпляр WebDriver для каждого потока, который будет запускать несколько вкладок просмотра / windows. До этого момента кажется, что ваша программа идеальна.
Теперь разные потоков могут быть запущены на одном Webdriver , но тогда результаты тестов не будут такими вы ожидаете. Причина в том, что когда вы используете многопоточность для запуска разных тестов на разных вкладках / windows требуется немного кодирования безопасности потока, иначе вы будете выполнять такие действия, как click()
или send_keys()
go к открытой вкладке / окну, которое в настоящее время имеет focus независимо от того, какой поток вы ожидаете запустить. Это по сути означает, что все тесты будут выполняться одновременно на одной вкладке / окне, в котором есть focus , но not на предполагаемой вкладке / окне.
Дополнительные замечания
Однако другой проблемой является несовместимость между версиями двоичных файлов, которые вы используете следующим образом:
- Вы используете chromedriver = 2,35
- В заметках о выпуске chromedriver = 2,35 четко упоминается следующее:
Поддержка Chrome v62 -64
- Вы используете chrome = 70.0
- Примечания к выпуску ChromeDriver vv2.44 ясно упоминает следующее:
Поддержка Chrome v69-71
- Ваш Клиент Selenium версия 3.9.1 , что почти 2 лет старше.
Таким образом, существует явное несоответствие между Selenium Client v3.9.1 , ChromeDriver v2.35 и Chrome Браузер v70.0
Решение
Убедитесь, что:
- JDK является повышен до текущих уровней JDK 8u241 .
- Selenium обновлен до текущих уровней Версия 3.141.59 .
- ChromeDriver обновлен до текущего ChromeDriver v80.0 уровень.
- Chrome обновлен до текущего Chrome Версия 80.0 уровень. (согласно примечаниям к выпуску ChromeDriver v80.0 )
- Если ваша базовая Веб-клиент версия устарела, затем удалите ее через Revo Uninstaller и установите последнюю версию GA и выпущенную версию Веб-клиент .
- Возьмите Перезагрузку системы .
- Всегда вызывать
driver.quit()
в tearDown(){}
способ закрыть и уничтожить WebDriver и Веб-клиент изящно.
tl; dr
Как установить ограничение памяти для OOM Killer для chrome?