Java 为JSP重新加载Tomcat类

Java 为JSP重新加载Tomcat类,java,tomcat,classloader,dynamic-class-loaders,Java,Tomcat,Classloader,Dynamic Class Loaders,当涉及到重新加载JSP时,类重新加载在Tomcat中是如何工作的(我谈论的是内部架构) 我知道每个JSP都被编译成一个Java类。但是,如果类加载器不允许类卸载并且不收集太多垃圾,那么类加载器(每个web应用程序都是唯一的)如何重新加载这些生成的类呢?如果您想接受教育,请阅读代码 从这里开始:标准Java类加载器从不卸载类。Tomcat有自己的类加载器,它可以用一个新实例替换一个类的旧实例,然后孤立旧实例,以通常的方式将其提供给垃圾收集器 在这一行的某个地方,我读到,如果一个类在指定的时间段内没

当涉及到重新加载JSP时,类重新加载在Tomcat中是如何工作的(我谈论的是内部架构)


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

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


从这里开始:

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


在这一行的某个地方,我读到,如果一个类在指定的时间段内没有被使用,Tomcat将卸载它。但是我目前找不到任何关于这方面的参考。

JasperLoader实例是classloader加载jsp生成的servlet

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

引述下列评论:

确实需要卸载旧类,但不能这样做。做 下一个最好的办法就是扔掉JspLoader 将创建一个新的加载程序,该加载程序将加载新的 班级


另请参见。

我不同意“不收集太多垃圾”,因为Tomcat以在几次热重新部署后内存不足而闻名。是的,@maksimov,你说得对。也许我还应该补充一个问题,问一下Tomcat降低内存不足错误概率的策略是什么。有趣的是,他们正在使用ECJ增量编译器进行JSP编译。@maksimov Tomcat在几次热部署后内存不足。相反,许多web应用程序编写得很差,而且很多都在Tomcat实例上运行。一个正确编写的web应用程序可以被重新部署数百次,而无需重新启动Tomcat,也无需耗尽内存。@ChristopherSchultz我不会争辩,因为它可能只通过Eclipse运行——以我的经验和其他人的经验(谷歌在此提供帮助)。我理解这可能是由于不同的过程和执行方法造成的,但问题仍然存在。我已经检查了代码。但是,我不理解的是:在Java中,每个类加载器都有一个已加载类的列表(请参阅ClassLoader中的私有属性类)。addClass方法是唯一一个将类添加到此属性的方法,它由JVM调用。这样,每个类对象至少有一个对它的引用,如果没有反射,自定义类加载器就不能删除这个引用。据我所知,Java中的想法是强制GC卸载一个类,直到它卸载了最初加载它的类加载器。(续)我检查了Tomcat如何加载类,但我找不到类加载器中属性类的引用。因此,我的理解是,一个类一旦被加载,实际上永远不会被卸载。因此,最终,这将导致与内存相关的错误。我很好奇Tomcat为什么不来这里。