다른 팀에서 사용하고있는 코드가 있는데 응용 프로그램에서 의심되는 메모리 누수를 추적하는 데 많은 시간을 할애했습니다. 몇 번의 재배포 후에 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를 강제해야합니다.
내 의심을 확인해 주셔서 감사합니다. 이 문제에 대한 정말 이상한 점은이 코드를 사용하는 수십 개의 응용 프로그램이 있지만 응용 프로그램이 메모리 누수 유일한 응용 프로그램 인 것 같습니다. 유출 된 응용 프로그램은 Spring 3.0.5를 처음 사용합니다 (이전 응용 프로그램은 2.5.x에있었습니다). 나는이 누수가 지금 나타나게 할 다른 어떤 차이점을 생각할 수 없다. 어떤 아이디어? –
@ Ryan : 상황에 따라 크게 달라집니다. 예를 들어, BeanPostProcessors는 종료 될 때 컨텍스트에 의해 명시 적으로 null이되지 않으며 가비지 수집에 의존합니다. 모든 컨텍스트가이를 사용하지는 않습니다. – skaffman