我们使用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
请在错误堆栈跟踪下面找到:
此错误消息...
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()
将转到当前具有焦点的打开的选项卡/窗口,而不管您期望运行的线程是什么)。这实质上意味着所有测试将同时运行在具有焦点的相同选项卡/窗口上,但不运行在目标选项卡/窗口上。
然而,另一个问题是您正在使用的二进制文件版本之间的不兼容性,如下所示:
支持Chrome v62-64
支持Chrome v69-71
因此,Selenium Client V3.9.1、ChromeDriver V2.35和Chrome Browser V70.0之间存在明显的不匹配
如何为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