Может ли объявление статического ApplicationContext вызвать утечку памяти?(Весна 3) - PullRequest
6 голосов
/ 02 мая 2011

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

1 Ответ

6 голосов
/ 02 мая 2011

Да, хранение статической ссылки на ApplicationContext может привести к утечкам памяти во многих настройках.То, как некоторые серверы приложений и JVms взаимодействуют со своей загрузкой классов, означает, что объекты, на которые имеются ссылки в статических полях, могут быть сохранены в пуле памяти PermGen (по крайней мере, в JVM Sun Hotspot).Springconcontexts могут быть очень большими объектными графами, в зависимости от того, как выглядит ваша контекстная конфигурация.

Единственное постоянное решение этой проблемы, которое я обнаружил, состоит в том, чтобы избежать горячего развертывания в производственных средах, которое обходит permgenпроблема утилизации в целом.Это все еще раздражает в среде разработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...