我有一个 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/