19

根据链接http://www.xyzws.com/Servletfaq/when-is-destroy-of-servlets-called/20,调用destroy方法的原因之一是当servlet没有收到请求时很久了

我在想可能有一些页面很长时间没有被调用。那么,这是否意味着将调用销毁并且不再使用它们?

实际上,我在采访中被问到这个问题,他告诉我只有在服务器关闭时才会调用destroy方法。

感谢您对此的任何帮助。

4

8 回答 8

10

AFAIK,

在 java servlet 中,destroy()不应该由程序员调用。但是,如果它被调用,它就会被执行。隐含的问题是,servlet 会被破坏吗?不,它不会。destroy()方法不应该也不会破坏 java servlet。

在 java servlet 中的含义destroy()是,内容在容器决定销毁 servlet 之前执行。但是,如果您destroy()自己调用该方法,则内容只会被执行,然后相应的过程会继续。对于这个问题,destroy()执行,然后完成 servlet 初始化。

destroy()首先调用方法,然后从容器中删除 Servlet,最后进行垃圾回收。destroy()方法通常包含释放任何资源的代码,例如不会被垃圾收集的 JDBC 连接。

于 2013-03-19T05:39:23.003 回答
5

几个案例:

  1. 当容器关闭或应用程序关闭时;
  2. 当容器判断内存不足时;
  3. 当这个 servlet 很长时间没有收到请求时。

根据文档

由 servlet 容器调用以向 servlet 指示 servlet 正在停止服务。只有在 servlet 的服务方法中的所有线程都退出或经过超时时间之后,才会调用此方法。servlet容器调用该方法后,不会再在该servlet上调用service方法。

于 2014-11-19T12:48:25.183 回答
3

从规范(The Servlet Interface -> Servlet Life Cycle -> End of Service):

一旦对 servlet 实例调用了 destroy 方法,容器就不能将其他请求路由到该 servlet 实例。如果容器需要再次启用 servlet,它必须使用 servlet 类的新实例。

该规范指的是正在销毁的 servlet 的特定实例。

那么,这是否意味着将调用销毁并且不再使用它们?

这并不意味着实例被销毁的 servlet 永远不会被使用。只有那个特定的实例没有被使用,因为它会被垃圾收集。当该 servlet 收到请求时,容器将创建该 servlet 的新实例并执行所有生命周期操作,直到再次为请求提供服务。

于 2012-11-18T03:57:03.490 回答
1

从 Servlet 规范:-

servlet 容器调用destroy() 方法以向servlet 指示该servlet 正在停止服务。只有在 servlet 的服务方法中的所有线程都退出或经过超时时间之后,才会调用此方法。servlet容器调用destroy()方法后,不会再在“THIS SERVLET”上调用service方法。

servlet 容器不需要在任何特定时间段内保持加载 servlet。servlet 实例可以在 servlet 容器中保持活动状态,时间为毫秒,在 servlet 容器的生命周期内(可能是几天、几个月或几年),或者介于两者之间的任何时间。

当 servlet 容器确定应该从服务中删除一个 servlet 时,它会调用 Servlet 接口的 destroy 方法以允许 servlet 释放它正在使用的任何资源并保存任何持久状态。例如,当容器想要节省内存资源或正在关闭时,它可能会这样做。

在servlet容器调用destroy方法之前,它必须允许servlet的service方法中当前正在运行的任何线程完成执行,或者超过服务器定义的时间限制。

一旦对 servlet 实例调用了 destroy 方法,容器就不能将其他请求路由到该 servlet 实例。

如果容器需要再次启用 servlet,它必须使用 servlet 类的新实例。

于 2018-12-27T05:37:40.210 回答
0

这完全取决于您使用的 servlet 容器的实现。如果你的 servlet 容器对于节省资源非常保守,它可能会破坏长时间不服务的 servlet。

在 servlet spec 2.5 的第 22 页中,您会发现,“当 servlet 容器确定应该从服务中删除一个 servlet 时,它会调用 Servlet 接口的 destroy 方法以允许 servlet 释放它正在使用的任何资源并保存任何持久状态。例如,当容器想要节省内存资源或正在关闭时,它可能会这样做。

于 2012-11-18T04:14:24.223 回答
0

Servlet.destroy()的 javadoc 说:“由 servlet 容器调用以向 servlet 指示 servlet 正在停止服务”。它没有指定什么情况会导致 servlet “停止服务”,它只是一个事件,您可以在需要时对其做出反应。例如,您可能想要关闭一些已打开的资源,或将某些状态保存到存储中。

最明显的原因是 servlet 容器正在关闭,但容器同样可以决定是时候卸载 servlet,因为它在一个月内没有使用,只是在消耗资源。这种行为完全取决于实现,而不是您(作为 servlet 设计者)应该关心的事情。

于 2014-05-16T15:43:16.450 回答
0

这是那些经典的规范与实现的事情之一。规范允许像 Tomcat 这样的 Servlet 容器维护一个 Servlet 对象池,在负载上升或下降时创建和销毁它们。在这种设置中,当不再需要特定实例时会调用destroy。为每个请求创建一个新实例甚至在处理请求之前立即调用 init 并在之后立即销毁也是合法的。

然而实际上,实际上每个 Servlet 容器都只维护每个 Servlet 的一个实例。由于要求 Servlet 是线程安全的,所以这也完全没问题。在这种情况下,只有在上下文关闭时才会调用destroy。

我想不出你想要汇集 Servlet 的许多情况,但规范允许这样做。

于 2012-11-18T03:52:36.680 回答
0

Servlet 的destroy 方法是一个回调。这些是容器在特定事件即将发生时调用的函数(在这种情况下,servlet 即将被销毁)。因此,整个目的是如果您想做某事(例如:清理资源),您可以在此回调下执行这些操作。

于 2017-05-31T12:41:44.323 回答