我很好奇 servlet 容器生命周期中的这种特殊情况。假设我们为 servlet 容器分配了一些内存来加载 servlet(类)。现在在特定时间内存已满,容器必须加载新的 servlet。在这种情况下,当使用任何算法取出加载的容器时(如果您可以分享,我也很高兴),并用所需的 servlet 替换。这里到底发生了什么?是否调用了 destroy 方法?好奇的原因是,当被替换的servlet重新加载时,是不是第二次调用了init()方法?
最佳答案
Servlet 不会因为内存已满而从内存中卸载。事实上,Servlet 对象通常很小并且通常没有任何成员变量,因为状态完全存储在由 servlet 处理的请求/响应对象中。通常,任何时候每个 servlet 都只会分配一个实例。
这基本上使您的其余问题无效。一个 servlet 只有在其 web 应用程序被取消部署时才会被卸载。当发生这种情况时,确实会调用 destroy
。然而,如果出现 OutOfMemory
情况,通常什么也做不了(因为所有可以被垃圾收集的东西都将被收集),所以你不能依赖 destroy
当没有剩余内存时被调用。但是,你可能已经猜到了,当没有更多的内存时,init
将不会被再次调用,因为没有剩余空间来初始化更多的对象。
当一个 web 应用程序被重新部署时,destroy
将在取消部署的 servlet 上被调用,并且 init
将在第一次使用新部署的 servlet 之前被调用。
确定释放哪些对象的算法是垃圾收集器的算法(可配置)。但它只会收集未使用的(“垃圾”、“未引用”)对象,不会一段时间未使用的随机 Servlet。
关于tomcat - 如何从内存中强制卸载加载的 servlet | Tomcat ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47031729/