在Spring Singleton中创建新实例会造成内存泄漏吗?

时间:2011-08-14 11:31:26

标签: java spring design-patterns

我正在维护一个应用程序,并注意到在Spring连接中定义为Singleton的许多对象在其方法中创建了其他对象的新实例。

例如,每次调用login()方法时都会有一个LoginService Singleton创建一个新的LoginDetails实例。 LoginDetails是临时的,只有执行login()方法才需要。

我的问题是,如果Spring为LoginService创建了一个对象,那么LoginDetails的实例是如何标记为垃圾收集的,作为对创建它们的对象的引用并使用它们永远不会终止?

我的意思是:

public void deleteCustomer(Long customerId, HttpServletRequest request) {

    CustomerType customerType = new CustomerType();
    customerType.setCustomerId(customerId);

    CustomerDeleteRequestType deleteRequest = new CustomerDeleteRequestType();
    deleteRequest.setCustomer(customerType);

    CustomerDeleteResponseType deleteResponse = mmmwsClient.executeRequest(deleteRequest);
    log.debug("Delete Response Recieved from Server for Customer Name Update " + deleteResponse.getServiceResult());

}

由于使用的字段只是方法变量而不是实例变量,我想在方法完成时会破坏对它们的引用吗?

我对Spring Singleton的理解是否正确?

由于

2 个答案:

答案 0 :(得分:5)

如果单例不维护对它创建的对象的引用(通过将它们存储在实例字段中),并且如果没有其他可到达对象保持对这些对象的引用,则它们变得无法访问,并且垃圾收集器收集它们。

创建对象的人对垃圾收集器并不重要。谁有对象的引用是。

答案 1 :(得分:1)

老实说,我不明白这个问题,但是已经很晚了,所以请耐心等待。

我查看了this页面,似乎每次调用该方法时都会创建一个新实例。

如果你像他们一样使用它,一个很好的替代品可能是:

private static MessageResourceSingleton singleton;

public static MessageResourceSingleton getInstance() {
    if (singleton == null) {
        singleton = new MessageResourceSingleton();
    }
    return singleton;
}

我可能不完全了解您的目标,但如果您能向我们展示一些您正在使用的示例,那么可以帮助