根据链接http://www.xyzws.com/Servletfaq/when-is-destroy-of-servlets-called/20,当servlet长时间没有请求时,调用destroy方法的原因之一是 。
我原以为可能会有一些页面长时间没有被调用。那么,这是否意味着将会调用destroy并且它们将不再被使用?
实际上,我在采访中被问到这个问题,他告诉我只有在关闭服务器时才会调用destroy方法。
感谢您的任何帮助。
答案 0 :(得分:9)
AFAIK,
在java servlet中,destroy()
不应该由程序员调用。但是,如果它被调用,它就会被执行。隐含的问题是,servlet会被破坏吗?不,它不会。 destroy()
方法不应该也不会破坏java servlet。
java servlet中destroy()
的含义是,当容器决定销毁servlet之前,内容就会被执行。但是如果您自己调用destroy()
方法,则会执行内容,然后继续相应的过程。对于这个问题,destroy()
被执行,然后servlet初始化完成。
destroy()
方法,然后从容器中删除Servlet,最后进行垃圾回收。 destroy()
方法通常包含释放任何资源(如JDBC连接)的代码,这些资源不会被垃圾回收。
答案 1 :(得分:4)
几个案例:
根据文件
由servlet容器调用以向servlet指示该 servlet正在停止服务。此方法仅调用一次 servlet的服务方法中的所有线程都已退出或之后 超时期限已过。 servlet容器调用它之后 方法,它不会再在这个servlet上调用服务方法。
答案 2 :(得分:3)
来自规范(The Servlet Interface -> Servlet Life Cycle -> End of Service
):
在servlet实例上调用destroy方法后,容器可能无法路由 对该servlet实例的其他请求。如果容器需要启用 再次使用servlet,它必须使用servlet类的新实例。
规范指的是正在销毁的servlet的特定实例。
那么,这是否意味着将会调用destroy并且不再使用它们?
这并不意味着永远不会使用其实例被销毁的servlet。它只是那个没有使用的特定实例,因为它本来是垃圾收集的。当一个请求进入该servlet时,容器将创建该servlet的新实例并执行所有生命周期操作,直到再次提供请求为止。
答案 3 :(得分:0)
这是经典规范与实施之一。规范允许像Tomcat这样的Servlet容器来维护Servlet对象池,在负载上升或下降时创建和销毁它们。在这种设置中,当不再需要特定实例时,将调用destroy。为每个请求创建一个新实例甚至是合法的,在处理请求之前立即调用init并在之后立即销毁。
但实际上,实际上每个Servlet容器都只维护每个Servlet的一个实例。由于要求Servlet是线程安全的,所以这也是完全可以的。在这种情况下,仅在关闭上下文时调用destroy。
我想不出很多你想要汇集Servlet的情况,但规范允许这样做。
答案 4 :(得分:0)
这完全取决于您正在使用的servlet容器的实现。如果您的servlet容器非常保守以节省资源,它可能会破坏长时间未使用的servlet。
在servlet规范2.5的第22页中,您会发现,“当servlet容器确定应该从服务中删除servlet时,它会调用Servlet接口的destroy方法以允许servlet释放任何资源。使用并保存任何持久状态。例如,容器可以在想要节省内存资源或关闭时执行此操作。“
答案 5 :(得分:0)
Servlet.destroy()的javadoc说:“由servlet容器调用,向servlet指示servlet正在停止服务”。它没有指定哪些情况会导致servlet“停止服务”,它只是一个事件,如果需要,您可以对此做出反应。例如,您可能希望关闭已打开的某些资源,或将某些状态保留到存储中。
最明显的原因是servlet容器正在关闭,但容器同样可以很好地决定卸载servlet的时间,因为它在一个月内没有被使用,只是消耗资源。这种行为完全取决于实现,并不是你(作为servlet设计者)应该关注的事情。
答案 6 :(得分:0)
Servlet的destroy方法是一个回调。这些是当特定事件即将发生时容器调用的函数(在这种情况下,servlet即将被销毁)。因此,如果您想要做某事(例如:清理资源),您可以在此回调下执行此操作。
答案 7 :(得分:0)
来自Servlet规范:-
servlet容器调用destroy()方法,以向servlet指示该servlet正在退出服务。仅当servlet的service方法中的所有线程都已退出或经过超时时间后,才调用此方法。 在servlet容器调用destroy()方法之后,它将不会再次在“ THIS SERVLET”上调用服务方法。
不需要servlet容器在任何特定时间段内都保持servlet的加载。 servlet实例可以在servlet容器中保持活动状态达毫秒的时间,也可以是servlet容器的生命周期(可能是几天,几个月或几年),或者介于两者之间的任何时间。
当Servlet容器确定应从服务中删除Servlet时,它将调用Servlet接口的destroy方法以允许Servlet释放其正在使用的任何资源并保存任何持久状态。例如,当容器要节省内存资源或将其关闭时,可以执行此操作。
在servlet容器调用destroy方法之前,它必须允许servlet的service方法中当前正在运行的任何线程完成执行,或超过服务器定义的时间限制。
在Servlet实例上调用destroy方法之后,容器可能不会将其他请求路由到该Servlet实例。