我已经创建了一个CLI应用程序(使用Spring)来读取外部API,将其存储在数据库中并处理该数据。
要处理数据,我正在使用项目反应器(https://projectreactor.io/)并行执行操作。
但是我看到的是Java进程在需要做很多工作时不会退出。
我发现的是,当您触发完整的垃圾回收(例如,使用IQKeyboardManager.shared.enableAutoToolbar = false
)时,该过程将停止。
因此,在这种情况下,挂起的不是线程(由我在应用程序中创建的)或怪异的死锁,而是垃圾回收器中的某些东西。
基本上我的程序是这样的:
jconsole
public class Runner {
private static Logger logger = LoggerFactory.getLogger(Runner.class);
public static void main(String[] args) {
try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext()) {
run(args, context);
} catch (Throwable t) {
logger.error("error", t);
} finally {
logger.info("closed application context");
}
}
}
方法会触发许多其他代码(我认为这不是很相关)。
有趣的是,run
被记录下来,但是什么也没发生。
一些粗略的解决方案是在最后调用closed application context
和System.gc()
,但我希望有更好的(配置)解决方案?