java - "java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached"如果程序由 cron 启动

标签 java cron out-of-memory

我有一个 java 程序,当我通过普通 shell 命令 (java -jar xxx.jar) 启动它时,它在我的 UNIX Web 服务器上运行得很好

但是,我正在尝试通过 cron 进行计划运行并收到以下错误:

[0.075s][warning][os,thread] Failed to start thread - pthread_create failed (EAGAIN) for attributes: stacksize: 1024k, guardsize: 0k, detached.
Exception in thread "main" java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached
    at java.base/java.lang.Thread.start0(Native Method)
    at java.base/java.lang.Thread.start(Thread.java:801)

如前所述,它似乎不是 java 编码错误,因为它在启动 shell 时似乎运行没有任何问题。这似乎也不是 cron 的错误,因为其他 java 程序执行得很好。

我读到 cron 的系统资源是有限的。于是我检查了系统中的用户限制:

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

然后我调整了 cron 的 systemd:

$ systemctl stop cron
$ sudo systemctl edit cron
$ systemctl daemon-reload
$ systemctl start cron

并且,在“systemctl edit cron”文件中,我尝试复制 ulimit 值 (映射位于https://unix.stackexchange.com/questions/345595/how-to-set-ulimits-on-service-with-systemd)

TasksMax=unlimited
LimitCORE=unlimited
LimitDATA=unlimited
LimitFSIZE=unlimited
LimitSIGPENDING=1545091
LimitMEMLOCK=65536
LimitRSS=unlimited
LimitNOFILE=1024
LimitSTACK=unlimited
LimitCPU=unlimited
LimitNPROC=62987
LimitAS=unlimited
LimitLOCKS=unlimited

但是,这一切并没有多大帮助,当 cron 尝试启动程序时的错误仍然是相同的。

由于我在这里完全失去了理智,欢迎任何建议。

最佳答案

因此,经过一些进一步的研究,我发现必须更改整个系统以及 cron 服务的“DefaultMaxTasks”。该值设置为 195,太低了。

有用的链接是: https://www.suse.com/support/kb/doc/?id=000015901 https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/configuring-defaulttasksmax-for-suse.html#GUID-0815D18D-65E7-46B2-BA89-F54BA02EFCB8

更改整体 DefaultTasksMax:

$ systemctl show --property DefaultTasksMax
DefaultTasksMax=195
$ cd /etc/systemd
$ vi system.conf
(set DefaultTasksMax = 65535)
$ systemctl daemon-reload
$ systemctl show --property DefaultTasksMax
DefaultTasksMax=65535

更改 cron 的值:

$ cd cron.service.d
$ ls
override.conf
$ vi override.conf

在 override.conf 中,我设置了新值,包括。默认任务最大:

DefaultTasksMax=65535
LimitCORE=unlimited
LimitDATA=unlimited
LimitFSIZE=unlimited
LimitSIGPENDING=1545091
LimitMEMLOCK=65536
LimitRSS=unlimited
LimitNOFILE=1024
LimitSTACK=unlimited
LimitCPU=unlimited
LimitNPROC=62987
LimitAS=unlimited
LimitLOCKS=unlimited

检查显示设置的值也是为 cron 新设置的:

$ systemctl status cron.service |grep -e Tasks
Tasks: 5 (limit: 65535)

之后问题就解决了

关于java - "java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached"如果程序由 cron 启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72477454/

相关文章:

java - 判断矩形是否重叠

c# - Corel 绘图 API (Java/C#)

linux - Crontab 不执行 R 脚本

android - 异常 : OutOfMemoryError

缩放时Android MapView出现内存不足错误

java - 安卓工作室 : java. lang.OutOfMemoryError

java - 从命令行检查字符数

Java 客户端拒绝连接到远程服务器

linux - 脚本的crontab

java - Selenium FirefoxDriver 如何使用 Crontab 执行自动化测试