2011-05-02 3 views
6

다른 팀에서 사용하고있는 코드가 있는데 응용 프로그램에서 의심되는 메모리 누수를 추적하는 데 많은 시간을 할애했습니다. 몇 번의 재배포 후에 OutOfMemory 오류가 발생합니다. YourKit Java Profiler와 IBM Support Assisant Memory Analyzer를 포함하여 여러 도구를 사용하여 누수를 추적했습니다. 내 응용 프로그램은 spring-mvc 주석 기반 제어기를 사용하여 WebSphere 6.1에서 실행되는 Spring 3.0.5 J2EE 응용 프로그램입니다.정적 ApplicationContext를 선언하면 메모리 누수가 발생할 수 있습니까? (Spring 3)

나는 매우 의심 찾을 클래스에 포인트를 수행 한 연구의 대부분, 우리는 MyFactory를 부를 것이다 그것은 다음과 같습니다 : 다른 논리의 전체 무리가이 클래스에 있습니다

import org.springframework.context.ApplicationContextAware; 

public final class MyFactory implements ApplicationContextAware { 

    //this should be changed to be non static after getInstance is removed 
    private static ApplicationContext applicationContext; 

    public MyFactory() { 
     //empty 
    } 

    public static SettingObjectFactory getInstance() { 
     return (MyFactory) applicationContext.getBean("MyFactory"); 
    } 

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
     MyFactory.applicationContext = applicationContext; 
    } 


} 

기본적으로 데이터베이스에서 데이터를 읽고이를 메모리 (캐시 근처)에 저장합니다. 그러나이 클래스는 응용 프로그램을 다시 배포 한 후 ApplicationContext에 매달려있는 것처럼 보입니다.

이 클래스의 클래스 로더가 ApplicationContext에 매달려 있거나 완전히 제거되지 않습니까? 더 이상 getInstance 메소드가 필요 없다는 것을 알고 있으며,이 클래스를 정적 ​​ApplicationContext로 만들 필요가 없다는 것을 알 수 있습니다. Spring은이 클래스의 singleton-ness를 강제해야합니다.

답변

6

예, ApplicationContext에 대한 정적 참조를 유지하면 많은 설정에서 메모리 누수가 발생할 수 있습니다. 일부 애플리케이션 서버와 JVms가 클래스 로딩과 상호 작용하는 방식은 정적 필드에서 참조되는 객체가 PermGen 메모리 풀 (Sun Hotspot JVM)에 유지 될 수 있음을 의미합니다. Spring appcontexts는 컨텍스트 설정이 무엇인지에 따라 매우 큰 객체 그래프가 될 수 있습니다.

내가 찾은 유일한 영구적 인 해결책은 생산 환경에서의 핫 배포를 피하는 것입니다.이 환경은 퍼텐젠 재활용 문제를 완전히 해결합니다. 하지만 개발 환경에서는 여전히 성가시다.

+0

내 의심을 확인해 주셔서 감사합니다. 이 문제에 대한 정말 이상한 점은이 코드를 사용하는 수십 개의 응용 프로그램이 있지만 응용 프로그램이 메모리 누수 유일한 응용 프로그램 인 것 같습니다. 유출 된 응용 프로그램은 Spring 3.0.5를 처음 사용합니다 (이전 응용 프로그램은 2.5.x에있었습니다). 나는이 누수가 지금 나타나게 할 다른 어떤 차이점을 생각할 수 없다. 어떤 아이디어? –

+0

@ Ryan : 상황에 따라 크게 달라집니다. 예를 들어, BeanPostProcessors는 종료 될 때 컨텍스트에 의해 명시 적으로 null이되지 않으며 가비지 수집에 의존합니다. 모든 컨텍스트가이를 사용하지는 않습니다. – skaffman

관련 문제