当前位置: 首页 > 知识库问答 >
问题:

java.lang.OutOfMemoryError:无法在Spring Boot中通过Selenium使用ChromeDriver和Chrome创建新的本机线

钦枫
2023-03-14

我们使用spring Boot开发了基于selenium的web应用程序。服务器位于google cloud服务器上作为VM实例。

我们有一个使用Executor的线程基机制。使用selenium,我们打开一个chrome浏览器(无头)来执行操作,并为每个操作创建新线程。

executorService = Executors.newFixedThreadPool(1);
Future<Object> futureDetails = executorService.submit(new Callable<Object>() {

        @Override
        public Object call() throws Exception {

            Object response = client.getDetails(number);

            return response;
        }
    });

    executorService.shutdown();

请在下面找到版本的详细信息。

Spring Boot-2.0.0版本

硒-3.9.1

请使用以下资源报告:ulimit-a

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 257648
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 10240
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 257648
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

此外,我使用free-m检查了内存

              total        used        free      shared  buff/cache   available
Mem:          64433        9479       54490         279         463       54132
Swap:             0           0           0

请在错误堆栈跟踪下面找到:

共有1个答案

卢阳泽
2023-03-14

此错误消息...

java.lang.OutOfMemoryError: unable to create new native thread

...暗示JVM无法创建任何新的本机线程,因为您的系统已运行OutOfMemory

当您尝试启动新程序或尝试使用已在运行的程序时,即使您仍有大量可用的物理和页面文件内存,也会出现内存不足错误消息。当您运行java程序或java应用程序时,os会为JVM分配一些内存。JVM将这个内存分成两部分。一个是堆栈内存,另一个是堆内存。堆栈内存用于执行方法,而堆内存用于存储对象。当堆变满时,JVM抛出java.lang.OutOfMemoryError

理想情况下,线程安全问题不在您的代码中,而在实际的浏览器绑定中。他们都假设一次只有一个命令(例如,像一个真实的用户一样)。但另一方面,您总是可以为每个线程实例化一个WebDriver实例,这将启动多个浏览选项卡/窗口。在此之前,你的程序似乎是完美的。

现在,可以在同一个Webdriver上运行不同的线程,但测试的结果将不是您所期望的。背后的原因是,当您使用多线程在不同的选项卡/窗口上运行不同的测试时,需要进行一点线程安全编码,否则您将执行的操作(如click()send_keys()将转到当前具有焦点的打开的选项卡/窗口,而不管您期望运行的线程是什么)。这实质上意味着所有测试将同时运行在具有焦点的相同选项卡/窗口上,但不运行在目标选项卡/窗口上。

然而,另一个问题是您正在使用的二进制文件版本之间的不兼容性,如下所示:

  • 您正在使用Chromedriver=2.35
  • Chromedriver=2.35的发行说明明确提到了以下内容:

支持Chrome v62-64

    null

支持Chrome v69-71

  • 您的Selenium客户端版本是3.9.1,几乎早了2年。

因此,Selenium Client V3.9.1、ChromeDriver V2.35和Chrome Browser V70.0之间存在明显的不匹配

    null

如何为Chrome设置OOM杀手的内存限制?

 类似资料:
  • 问题内容: 我看到这样的评论 我见过这个问题的一个地方是,如果您继续创建线程,而不是直接在线程对象上调用run(),而不是调用start()。这将导致线程对象不被取消引用…因此,一段时间后,出现无法创建新本机线程的消息 在Sun Java论坛上 在我的应用程序中,最初我们计划使用线程,但是后来,我们决定不再需要线程,因此我们只调用run()而不是start()。我们是否需要为新的threadCla

  • 我试图在(1and1VPS)上运行服务器。就在服务器启动和客户机的几个请求(重新加载网页)之后,我得到了这个错误: 但是当我在计算机上运行时,一切都正常。我使用和Centos5.8新安装制作了自己的虚拟服务器,它也在那里工作。 这个内存不足错误的原因可能是什么?如果你有任何建议,请分享。我不知道该怎么处理这个了。

  • 它的发生是因为我创建了许多线程,而没有关闭它们?还是经常创造新的? 有人能告诉我在代码中是否做错了什么吗?

  • 运行5-6小时后,我从spark-driver程序中得到以下错误。我正在使用Ubuntu16.04LTS和Open-JDK-8。 cat/proc/sys/kernel/threads-max “无法创建新的本机线程”显然意味着它与堆无关。所以我相信这更多的是一个操作系统的问题。

  • 我有一个爬行过程,在自定义类中启动selenium,如下所示: 此BrowserInterface类在批处理队列中初始化,并在批处理结束时调用quit()方法。启动chrome和获取数据都没有问题。问题是,在每个作业结束时,当quit()方法被调用时,chrome会进入僵尸模式。当下一个BrowserInterface初始化时,它将启动一个新的chrome实例。因此,该框的内存不足。我也尝试在ch