2012-06-07 2 views
2

Как перезагрузка классов работает в Tomcat, когда дело доходит до перезагрузки JSP (я говорю о внутренней архитектуре)?Перезагрузка Tomcat для JSP

Я знаю, что каждый JSP скомпилирован в Java-класс. Но как загрузчик классов (который уникален для каждого веб-приложения) перезагружает эти сгенерированные классы, учитывая, что загрузчик классов не позволяет разгружать классы и не собирать слишком много мусора?

+2

Я бы не согласился на «без сбора слишком большого количества мусора», потому что Tomcat известен тем, что у него заканчивается память после нескольких горячих повторных развертываний. – maksimov

+0

Да, @ Максимов, вы правы. Возможно, мне следует добавить вопрос, чтобы узнать, что такое стратегия Tomcat для снижения вероятности получения ошибки из памяти. –

+1

Некоторая информация о [Tomcat] (http://tomcat.apache.org/tomcat-5.5-doc/jasper-howto.html). Интересно знать, что они используют инкрементный компилятор ECJ для своей компиляции JSP. – maksimov

ответ

1

Прочтите код, если вы хотите получить образование.

Начало здесь: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/jasper/servlet/JspServlet.java?view=markup

+0

Я уже проверил код. Но я не понимаю: в Java каждый класс-загрузчик имеет список загруженных классов (см. Классы private property в ClassLoader). Метод addClass - единственный, который добавляет класс к этому свойству и вызывается JVM. Таким образом, каждый объект класса, по крайней мере, ссылается на него и без отражения, пользовательский загрузчик классов не может удалить эту ссылку. Из того, что я знаю, идея в Java заключается в том, чтобы заставить GC выгрузить класс только после того, как он выгрузит загрузчик классов, который загрузил его в первую очередь. –

+0

(продолжение) Я проверил, как Tomcat загружает классы. Я не могу найти ссылку на классы свойств класса ClassLoader. Итак, я понимаю, что класс на самом деле никогда не выгружается после его загрузки. Поэтому, в конце концов, это должно вызвать ошибку, связанную с памятью. И мне любопытно, что Томкат не может сюда добраться. –

0

Стандартный класс Java загрузчик никогда не выгружает класс. У Tomcat есть свои собственные загрузчики классов, которые могут заменить старый экземпляр класса новым экземпляром, а затем ставят сирот старый экземпляр, делая его доступным сборщику мусора обычным способом.

Где-то вдоль строки я читал, что если класс не используется в течение определенного периода времени, Tomcat выгрузит его. Но на данный момент я не могу найти ссылку на это.

1

Экземпляр JasperLoader представляет собой загрузчик классов, загружающий сервлеты, создаваемые jsp.

Компилятор jsp «отбрасывает» (устанавливается в null) старый экземпляр JasperLoader, когда он генерирует новый класс класса сервлета.

Цитата из комментариев в JspServletWrapper.setServletLastModifiedTime:

Действительно нужно разгрузить старый класс, но не может сделать это. Сделайте следующее лучшее, что выбрасывает JspLoader, так что будет создан новый загрузчик, который загрузит новый класс .

См. Также where this method is called after compiling.

Смежные вопросы