2013-02-15 66 views
0

静态方法,我们正在运行到的内存泄漏问题,我们怀疑,下面的代码可能是原因,我们在一个单独的类的静态方法,并怀疑其导致内存泄漏而其直接引用。声明在辛格尔顿的Spring bean

// 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 
....... 
....... 
} 

} 

请让我知道,因为我刚刚加入的伪需要进一步澄清。 我们正在运行到高的内存使用情况,我们怀疑,使用它在被弹簧发起集体声明的静态方法是不正确的垃圾收集,有内存泄漏,因为它发生。

问题 - 它是坏的有一个春天发起的单例类的静态方法,即使是静态的方法是通过直接引用,而不是使用它的实例变量。

+1

我不明白为什么使用静态方法会导致泄漏,但我应该承认,当班级是单身人士时,假设它永远不应该被收集(如果您期望的话) – 2013-02-15 19:58:37

+0

是的,我怀疑但不太确定,直到我到达根部。 – 2013-02-15 22:20:08

回答

0

静态方法不应引起了内存泄漏。这只是意味着该方法不使用任何类字段,并且可以在没有类实例的情况下被调用。 Java Documentation解释了这个 - 检查部分类方法

内存泄漏通常是因为一个“全局”字段保存到一个参考,从来没有使用它停止。这可能是一个集合。您应该像JConsole那样分析内存使用情况并列出最常用的对象。这应该可以帮助你缩小范围。

EDIT(详细信息):要调用一个静态方法没有初始化的对象。即任何地方都没有new SpringSingletonRestClient()

DomainResponse domainResponse = SpringSingletonRestClient.convertServiceResponseToDomainResponse(serviceResponse); 

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

+0

从长远来看,问题发生时,它不会立即增加CPU使用量,但需要一段时间。而且我们有新的遗迹定期分析我们的产品使用情况,我们可以看到这种方法被多次同时调用,当GC运行时,堆被清除,但cpu内存使用量不断增加并定期崩溃。这表明外面有东西在泄漏。 – 2013-02-15 22:15:52

+0

我同意静态方法,但我怀疑这种静态方法是在spring中管理的单例类中。如果这不是由GC挑选的。仍然记忆泄漏是对我来说没有任何意义的东西。我将运行JConsole并查看,谢谢您的建议。 – 2013-02-15 22:19:00

+0

我们是在谈论cpu使用情况还是mem使用情况?至于mem的使用,我已经在答案中提供了更多的信息,说明为什么静态方法不可能是罪魁祸首。 – 2013-02-15 22:44:38