setContextClassLoader импликации - PullRequest
       10

setContextClassLoader импликации

3 голосов
/ 02 декабря 2010

Я пытаюсь убрать предупреждения Tomcat об утечках памяти из-за создания собственных потоков. http://wiki.apache.org/tomcat/MemoryLeakProtection предполагает, что я вызову myThread.setContextClassLoader(null) до запуска потока.

Каков смысл этого призыва? Сможет ли код в методе run () разрешить классы из моего приложения?

1 Ответ

11 голосов
/ 02 декабря 2010

Да, будет. Thread.getContextClassLoader() - это механизм для загрузки базовых сред из дальнейшего уровня дерева загрузчика классов.

Возьмите иерархию загрузчика классов Tomcat.

      Bootstrap
          |
       System
          |
       Common
       /     \
  Webapp1   Webapp2 ... 

Платформа сервлета или JSP находится в загрузчике класса Common. Если одна из этих платформ должна загрузить ресурс classpath из Webapp1, они могут попробовать:

getClass().getResource("/some/resource/in/webapp1"); // fail

Но поскольку механика загрузки классов вызывает только цепочку загрузчика классов, это может произойти. Это означает, что все фреймворки, которым нужно загрузить ресурс, вместо этого:

Thread.currentThread().getContextClassLoader().getResource("/some/resource/in/webapp1");

И контейнер сервлета гарантирует, что это загрузчик класса Webapp1 всякий раз, когда поток выполняется в этом контексте. Таким образом, загрузчик классов контекста потока является эффективным способом для фреймворков загружать классы из «неправильного направления».

Когда вы создаете новый поток, этот поток по умолчанию получает загрузчик класса контекста своего родителя (ваш Webapp1 загрузчик классов). Следовательно, если вы остановите Webapp1, tomcat, как предполагается, сможет собирать данные в этом веб-приложении, но не сможет сделать это, пока есть какая-либо ссылка на загрузчик класса Webapp1 - отсюда и предупреждение.

Хорошая статья о загрузчиках контекстных классов .

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