首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >"java.lang.OutOfMemoryError:无法创建本机线程:可能已超出内存或进程/资源限制“,如果由cron启动程序

"java.lang.OutOfMemoryError:无法创建本机线程:可能已超出内存或进程/资源限制“,如果由cron启动程序
EN

Stack Overflow用户
提问于 2022-06-02 13:56:06
回答 1查看 1.9K关注 0票数 1

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

但是,我正在尝试通过cron执行预定的运行,并收到以下错误:

代码语言:javascript
复制
[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的系统资源是有限的。因此,我检查了系统中的用户限制:

代码语言:javascript
复制
$ 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的系统:

代码语言:javascript
复制
$ systemctl stop cron
$ sudo systemctl edit cron
$ systemctl daemon-reload
$ systemctl start cron

而且,在"systemctl编辑cron“的文件中,我试图复制ulimit值(在https://unix.stackexchange.com/questions/345595/how-to-set-ulimits-on-service-with-systemd中找到的映射)。

代码语言:javascript
复制
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试图启动程序时的错误仍然是相同的。

既然我在这里完全疯了,任何建议都是欢迎的。

EN

Stack Overflow用户

发布于 2022-06-08 20:28:45

因此,经过进一步的研究,我发现"DefaultMaxTasks“必须为整个系统以及cron服务进行更改。这个值被设置为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:

代码语言:javascript
复制
$ 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的值:

代码语言:javascript
复制
$ cd cron.service.d
$ ls
override.conf
$ vi override.conf

在override.conf中,我设置了新的值,包括。DefaultTasksMax:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
$ systemctl status cron.service |grep -e Tasks
Tasks: 5 (limit: 65535)

在那之后,问题解决了。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72477454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档