2013-02-15 2 views
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 
....... 
....... 
} 

} 

난 그냥 의사를 추가하기 때문에 더 설명이 필요한 경우 알려 주시기 바랍니다. 우리는 높은 메모리 사용량을 실행하고 있으며 봄에 의해 초기화 된 클래스에서 선언 된 정적 메서드를 사용하면 가비지 수집이 올바르게 수행되지 않아 메모리 누수가 발생한다고 의심됩니다.

질문 - 정적 메소드가 직접 참조에 의해 사용되고 인스턴스 변수에 의해 사용되지 않더라도 스프링에 의해 시작된 싱글 톤 클래스에서 정적 메소드를 사용하는 것은 좋지 않습니까?

+1

정적 메서드를 사용하면 누수가 발생할 수있는 이유가 표시되지 않지만 클래스가 싱글 톤일 때 결코 수집해서는 안된다고 인정해야합니다 (예상되는 경우) –

+0

예, 내가 뿌리를 잡을 때까지는 잘 모르겠다. –

답변

0

정적 메서드는 메모리 누수를 일으켜서는 안됩니다. 메소드가 클래스 필드를 사용하지 않고 클래스 인스턴스없이 호출 될 수 있다는 것을 의미합니다. Java Documentation 설명합니다. 클래스 메서드

"글로벌"필드가 참조를 보유하고 있기 때문에 메모리 누수가 일반적으로 발생하며이를 사용하는 것을 결코 중지하지 않습니다. 이것은 컬렉션 일 수 있습니다. 메모리 사용량을 프로파일 링하고 가장 많이 사용 된 객체를 나열하려면 JConsole과 같은 것이 필요합니다. 이렇게하면 범위를 좁히는 데 도움이됩니다.

EDIT (추가 정보) : 개체를 초기화하지 않고 정적 메서드를 호출하고 있습니다. 즉, 어디에도 new SpringSingletonRestClient()이 없습니다.

DomainResponse domainResponse = SpringSingletonRestClient.convertServiceResponseToDomainResponse(serviceResponse); 

위의 줄에서 봄은 부적합합니다. 이 메소드가 절차 언어 내에서 간단한 함수 인 것처럼 보인다. 따라서 메모리 누수가 발생할 수 없습니다.

+0

문제는 장기간에 걸쳐 발생합니다. 즉각적으로 CPU 사용량을 늘리지는 않지만 시간이 오래 걸립니다. 그리고 우리는이 방법이 여러 번 동시에 호출되는 것을 볼 수있는 생산 사용량을 주기적으로 프로파일 링합니다. GC가 실행될 때 힙은 지워지지만 CPU 메모리 사용은 계속 증가하고 주기적으로 중단됩니다. 힙 외부로 누출되는 것이 있음을 보여줍니다. –

+0

나는 정적 메서드에 동의하지만,이 정적 메서드는 스프링으로 관리되는 싱글 톤 클래스에있는 것으로 의심된다. GC에 의해 선택되지 않은 경우. 누출 된 메모리가 아직 나에게 아직 이해가 안되는 부분입니다. 나는 JConsole을 실행하고, 제안을 주셔서 감사합니다. –

+0

우리는 CPU 사용량 또는 mem 사용량에 대해 이야기하고 있습니까? mem 사용법에 관해서는 정적 메서드가 범인이 될 수없는 이유에 대한 답변에 더 많은 정보를 제공했습니다. –

관련 문제