我们遇到内存泄漏问题,我们怀疑下面的代码可能是原因,我们在单例类中有一个静态方法,并怀疑它在直接引用时导致内存泄漏。
// 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启动的单例类中使用静态方法是不好的,即使该静态方法由直接引用使用而未被其实例变量使用。
答案 0 :(得分:0)
静态方法不应导致内存泄漏。它只是意味着该方法不使用任何类字段,并且可以在没有类实例的情况下调用。 Java Documentation解释了这一点 - 检查类方法
部分内存泄漏通常发生,因为“全局”字段保留在引用上并且永远不会停止使用它。这可能是一个集合。您应该像JConsole那样分析内存使用情况并列出最常用的对象。这应该可以帮助你缩小范围。
编辑(更多信息):您在不初始化对象的情况下调用静态方法。即任何地方都没有new SpringSingletonRestClient()
。
DomainResponse domainResponse = SpringSingletonRestClient.convertServiceResponseToDomainResponse(serviceResponse);
在上面的行中,弹簧是无关紧要的。就好像该方法是一个过程语言中的简单函数。因此,这不会导致内存泄漏。