使用 CRON 但不使用 SHELL 导致 OOM

使用 CRON 但不使用 SHELL 导致 OOM

当我通过 shell 启动 Java 程序时,一切都运行良好。但是,如果我通过 CRON 使用相同命令和相同用户启动相同程序,几秒钟后就会出现 java.lang.OutOfMemoryError。

此外,只要我不终止被阻止的 Java 程序,CRON 就无法执行任何操作。无论启动哪个 cronjob,系统日志中总会显示“(CRON) 错误(无法分叉)”。终止 Java 程序后,所有新的 cronjob 都会再次正常运行。

Java 程序创建了许多线程(启动时创建 1500 个,之后创建更多),并且 - 当通过 crontab 启动时 - 它总是在创建了 475 个线程后开始挂起。因此,即使记录了 OutOfMemory,也可能更像是“OutOfThreads”。

为了测试目的,我将初始线程数减少到 450,使用此设置,几分钟内一切都运行良好(直到创建更多线程)。但是我真的需要这 1500 多个线程,我不知道为什么当 java 程序已通过 crontab 启动时这是不可能的。如上所述,只要我通过 shell 而不是通过 crontab 启动程序,一切都运行良好。

该问题仅出现在 Ubuntu 16.04 上,所有旧版本都运行良好。这是一个错误还是新的安全功能?我没有找到有关此问题的任何信息,所以我希望有人可以提供帮助。

相关内容