0

我们遇到了内存泄漏问题,我们怀疑下面的代码可能是原因,我们在单例类中有一个静态方法,并且怀疑它在直接引用时会导致内存泄漏。

// This class is wired in spring xml and loaded as spring bean
public class SpringSingletonRestClient{

// instance method to make a web-service call
public ServiceResponse getResponseFromARestService(String RequestParam){.....}

// public static helper bean mapping method, that is used outside this class 
// for converting the service response object to different object
public static DomainResponse convertServiceResponseToDomainResponse(ServiceResponse serviceResponse){ //conversion logic.... }
 }

}

用法

Class MainClass {

//injected as spring bean
SpringSingletonRestClient client;

public void someMethod(){
ServiceResponse serviceResponse = client.getResponseFromARestService(...);
DomainResponse domainResponse =  SpringSingletonRestClient.convertServiceResponseToDomainResponse(serviceResponse);
// use domainResponse object
.......
.......
}

}

请让我知道是否需要更多说明,因为我刚刚添加了伪。我们正在运行到高内存使用率,我们怀疑使用在由 spring 启动的类中声明的静态方法没有正确收集垃圾,并且因此发生内存泄漏。

问题 - 在 Spring 启动的单例类中使用静态方法是否很糟糕,即使该静态方法由直接引用使用,而不是由其实例变量使用。

4

1 回答 1

0

静态方法不应导致内存泄漏。它只是意味着该方法不使用任何类字段,并且可以在没有类实例的情况下调用。Java 文档对此进行了解释 - 检查部分类方法

内存泄漏通常会发生,因为“全局”字段保留引用并且永远不会停止使用它。这可能是一个集合。您应该使用 JConsole 之类的东西来分析内存使用情况并列出最常用的对象。这应该可以帮助您缩小范围。

编辑(更多信息):您正在调用静态方法而不初始化对象。即没有new SpringSingletonRestClient()任何地方。

DomainResponse domainResponse =  SpringSingletonRestClient.convertServiceResponseToDomainResponse(serviceResponse);

在上面的行中,弹簧是无关紧要的。就好像该方法是过程语言中的一个简单函数。因此,这不会导致内存泄漏。

于 2013-02-15T20:34:18.123 回答