我创建了一些工作人员类来处理他们从作业服务器中拾取的作业。 要执行的代码取决于使用spring-config + application.properties设置的一些环境变量。
此刻,我正在运行SpringApplication.run(app.class)来初始化spring boot,然后再启动worker,以便我的代码库可以通过ApplicationContext.getBean()访问环境变量。
问题在于,由于工作人员使用while(true)循环,因此不会触发spring shutdown钩子。因此,每次接收并执行新作业时,新实例化的对象都会加载到Spring类加载器中。这些对象没有在GC中,因为它们在类加载器中具有引用,因此Metaspace不断增长,导致出现OOM异常。
删除Spring引导程序,并将环境变量硬编码到代码中可以解决此问题,但这显然不是实际的解决方案。
我不确定如何解决此问题,并且愿意提出建议。理想情况下,我想加载spring-config,这样我就可以访问Bean和环境变量,而无需处理类加载器或任何其他spring开销。