Перегрузка классов Tomcat для JSP
Как перезагрузка классов работает в Tomcat, когда дело доходит до перезагрузки JSP (я говорю о внутренней архитектуре)?
Я знаю, что каждый JSP компилируется в класс Java. Но как загрузчик классов (который уникален для каждого веб-приложения) перезагружает эти сгенерированные классы, учитывая, что загрузчик классов не позволяет выгружать классы и не собирать слишком много мусора?
3 ответа
Экземпляр JasperLoader - это загрузчик классов, загружающий сгенерированные jsp сервлеты.
Компилятор jsp "выбрасывает" (устанавливает в ноль) старый экземпляр JasperLoader, когда генерирует новый файл класса сервлета.
Цитата из комментариев в JspServletWrapper.setServletLastModifiedTime:
Действительно нужно выгрузить старый класс, но не могу этого сделать. Сделайте следующую лучшую вещь - выбросьте JspLoader, чтобы создать новый загрузчик, который загрузит новый класс.
Смотрите также, где этот метод вызывается после компиляции.
Прочитайте код, если вы хотите получить образование.
Начните здесь: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/jasper/servlet/JspServlet.java?view=markup
Стандартный загрузчик классов Java никогда не выгружает класс. Tomcat имеет свои собственные загрузчики классов, которые могут заменить старый экземпляр класса новым экземпляром, а затем потерять старый экземпляр, сделав его доступным для сборщика мусора обычным способом.
Где-то вдоль линии я прочитал, что если класс не используется в течение определенного периода времени, Tomcat его выгружает. Но я не могу найти ссылку на это в данный момент.