在重新加载 JSP 时,类重新加载在 Tomcat 中是如何工作的(我说的是内部架构)?
我知道每个 JSP 都被编译成一个 Java 类。但是,考虑到类加载器不允许卸载类并且不收集太多垃圾,类加载器(每个 Web 应用程序都是唯一的)如何重新加载这些生成的类?
在重新加载 JSP 时,类重新加载在 Tomcat 中是如何工作的(我说的是内部架构)?
我知道每个 JSP 都被编译成一个 Java 类。但是,考虑到类加载器不允许卸载类并且不收集太多垃圾,类加载器(每个 Web 应用程序都是唯一的)如何重新加载这些生成的类?
JasperLoader 实例是加载 jsp 生成的 servlet 的类加载器。
jsp 编译器在生成更新的 servlet 类文件时“丢弃”(设置为 null)旧的 JasperLoader 实例。
引用JspServletWrapper.setServletLastModifiedTime中的评论:
确实需要卸载旧类,但不能这样做。做下一个最好的事情,即扔掉 JspLoader,这样将创建一个新的加载器来加载新的类。
另请参阅编译后调用此方法的位置。
标准的 Java 类加载器从不卸载类。Tomcat 有自己的类加载器,它可以用新实例替换类的旧实例,然后孤立旧实例,使其以通常的方式可供垃圾收集器使用。
在某处,我读到如果某个类在某个指定的时间段内未使用,Tomcat 将卸载它。但我目前找不到任何参考。
如果您想接受教育,请阅读代码。
从这里开始:http: //svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/jasper/servlet/JspServlet.java ?view=markup