3

在重新加载 JSP 时,类重新加载在 Tomcat 中是如何工作的(我说的是内部架构)?

我知道每个 JSP 都被编译成一个 Java 类。但是,考虑到类加载器不允许卸载类并且不收集太多垃圾,类加载器(每个 Web 应用程序都是唯一的)如何重新加载这些生成的类?

4

3 回答 3

2

JasperLoader 实例是加载 jsp 生成的 servlet 的类加载器。

jsp 编译器在生成更新的 servlet 类文件时“丢弃”(设置为 null)旧的 JasperLoader 实例。

引用JspServletWrapper.setServletLastModifiedTime中的评论:

确实需要卸载旧类,但不能这样做。做下一个最好的事情,即扔掉 JspLoader,这样将创建一个新的加载器来加载新的类。

另请参阅编译后调用此方法的位置

于 2016-10-19T10:20:58.277 回答
0

标准的 Java 类加载器从不卸载类。Tomcat 有自己的类加载器,它可以用新实例替换类的旧实例,然后孤立旧实例,使其以通常的方式可供垃圾收集器使用。

在某处,我读到如果某个类在某个指定的时间段内未使用,Tomcat 将卸载它。但我目前找不到任何参考。

于 2012-06-07T20:48:47.123 回答
0

如果您想接受教育,请阅读代码。

从这里开始:http: //svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/jasper/servlet/JspServlet.java ?view=markup

于 2012-06-07T19:15:44.753 回答