【问题标题】:Spring boot - Why does my Restcontroller not release reference to a new POJO?Spring boot - 为什么我的 Restcontroller 不释放对新 POJO 的引用?
【发布时间】:2017-09-14 20:49:55
【问题描述】:

我有一个弹簧休息控制器,它实例化一个新的 POJO。此 POJO 将用于反序列化来自 DB 的 XML 对象。

我注意到使用 IDEAs Memory View 插件,在我的应用程序的生命周期中,只创建了一个控制器对象(如预期的那样),但是对于控制器的每个请求都会创建一个新的 POJO 实例,并且即使在之后也不会收集垃圾请求完成。

这会导致内存不足异常。

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

@RestController
public class VendorController {

  private ChuckNorris chuckNorris;

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

    return "test";
  }
}

在这段代码中,每个请求都会创建一个新的 ChuckNorris 对象,它们会在内存中徘徊,直到应用程序终止。

【问题讨论】:

    标签: java spring spring-mvc model-view-controller garbage-collection


    【解决方案1】:

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

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

    为什么需要这个?

    private ChuckNorris chuckNorris;
    

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

    无法告诉您在不了解您的业务逻辑的情况下如何准确地重写代码。

    【讨论】:

    • 在我的真实示例中,控制器调用了一个 Autowired 服务组件。它实际上创建了 POJO 并调用另一个 Autowired 服务来填充它。但是,当我完成完整的 http 请求/响应然后执行另一个 http 请求时,第一个 POJO 仍然保留在内存中。这就像服务组件为每个请求创建一个新的 POJO,但从不释放对它的引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    相关资源
    最近更新 更多