1

我有一个弹簧休息控制器实例化一个新的POJO。这个POJO将被用于从一个数据库中反序列化一个XML对象。Spring引导 - 为什么我的Restcontroller不能释放对新POJO的引用?

我注意到与IDEA内存视图插件,在我的应用程序的生命周期,只有一个控制器对象被创建(按预期),但对控制器的每个请求创建一个新的POJO实例,而不是垃圾收集甚至请求完成后。

这导致内存不足异常。

什么是解决这个问题的最好方法?

@RestController 
public class VendorController { 

    private ChuckNorris chuckNorris; 

    @RequestMapping("/vendor") 
    public String vendors() { 
    ChuckNorris chuckNorris = new ChuckNorris(); 
    chuckNorris.setType("roundhouse"); 

    return "test"; 
    } 
} 

在该代码中,每个请求创建一个新的查克·诺里斯对象,直到应用程序终止他们挂在内存中。

回答

0

创建的对象不需要在方法退出后被释放。他们在gc()调用中被释放。 Gc调用取决于时间,内存等可用的多个参数。您可以尝试手动gc并检查对象是否仍然存在。

但是,通常从Controller中引用任何对象都是不正确的。

为什么你需要这个?

private ChuckNorris chuckNorris; 

如果控制器具有对POJO的引用,则POJO不能被销毁。尝试删除引用并重写代码,以避免将实例存储在Controller的级别上。

无法告诉你如何在不理解业务逻辑的情况下重写代码。

+0

在我现实世界的例子中,控制器调用Autowired服务组件。它实际上创建POJO并调用另一个Autowired服务来填充它。 但是,当我完成完整的http请求/响应,然后执行另一个http请求时,第一个POJO仍然保留在内存中。 这就像服务组件为每个请求创建一个新的POJO,但从未释放对它的引用。 – Faxy

相关问题