2013-02-15 80 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