当我通过 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 上,所有旧版本都运行良好。这是一个错误还是新的安全功能?我没有找到有关此问题的任何信息,所以我希望有人可以提供帮助。