tomcat - 如何从内存中强制卸载加载的 servlet | Tomcat

标签 tomcat servlets containers

我很好奇 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/

相关文章:

java - 在tomcat中部署solr服务时出错

java - 在 tomcat 7.0 中运行 Spring MVC 应用程序给我 HTTP 状态 404 : requested resource is not available.

eclipse - 未知参数 : -launcherDir GWT

java - 相当于 php exit() 或 die() 的 Tomcat Servlet 代码

php - 我应该运行多少个Docker容器

tomcat - 将AppFuse应用程序从Tomcat 7迁移到Jboss EAP 6.1

java - 关于MVC模型的疑惑

java - 如何在 Jsp 中屏蔽文本字段中的几个字符

python - 将 Oracle Instant 客户端安装到 Python cx_Oracle 的 Docker 容器中

c++ - std::vector 推速?