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