У меня есть код, который я использую от другой команды, и я потратил дни, пытаясь отследить предполагаемую утечку памяти в моем приложении.Я получаю ошибку OutOfMemory после нескольких повторных попыток.Я использовал несколько инструментов для отслеживания утечки, включая YourKit Java Profiler и анализатор поддержки IBM Support Assisant.Мое приложение - это J2EE-приложение Spring 3.0.5, работающее в WebSphere 6.1 с использованием контроллеров, управляемых аннотациями spring-mvc.
Большинство проведенных мною исследований указывают на класс, который я считаю очень подозрительным, мы назовем его 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 должен обеспечить единственность этого класса.