Может ли объявление статического ApplicationContext вызвать утечку памяти? (Spring 3)

У меня есть код, который я использую от другой команды, и я потратил дни, пытаясь отследить предполагаемую утечку памяти в моем приложении. После нескольких повторных развертываний я получаю ошибку 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 должен обеспечить одноэлементность этого класса.

6
задан Sean Patrick Floyd 2 May 2011 в 08:57
поделиться