我正在检查Java Servlet教程,但是我错过了服务器何时销毁servlet的信息?如果我想手动销毁一个未使用的Servlet以节省其他任务的内存,该怎么办?
因为我知道每个服务器都有内存限制,托管未使用的servlet浪费资源和应用程序质量,
感谢您澄清这一点,因为应用程序性能是开发过程中需要关注的最重要问题之一!
在多集群环境中,每个节点上只有一个Servlet实例,或者您可以说每个JVM机器上每个Servlet只有一个实例。
Servlet在应用程序启动时或在调用servlet时第一次初始化。
什么时候服务器破坏了servlet?
当服务器关闭或应用程序处置时,所有Servlet实例都将被销毁。
我想手动销毁一个未使用的Servlet来为其他任务节省内存!
你不能手动销毁Servlet,Servlet就像工作者不是数据容器。在大多数情况下,Servlet不包含任何实例成员以避免多线程问题。
容器决定何时卸载servlet,此序列释放它所持有的所有资源,以便在再次加载servlet时它可以重新获取它。
当servlet被设置为卸载时,卸载序列调用servlet的destroy()方法。 destroy()方法包含servlet开发人员编写的清理操作。在实践中,它应该释放它已经获得的任何资源,这些资源在此步骤中不会被垃圾收集。 destroy()方法还应该让servlet有机会写出未保存的缓存信息或在下次调用init()时应该读取的任何持久信息。
如果我们在servlet上调用destroy()那么它并不意味着我们的servlet将被卸载。您可以单独调用destroy方法而无需卸载servlet。但是当容器决定从内存中卸载servlet实例时,容器运行销毁机制,而destroy方法是销毁机制的一个步骤。
Servlet规范没有说明什么时候必须关闭和销毁servlet,除了它必须在容器完成正常关闭之前完成。否则,允许容器根据自己的判断从服务中删除空闲实例,只要它准备好在以后需要时启动新实例。
规范没有定义强制卸载servlet实例的机制。它已被卸载,回收其资源(主要是内存)是垃圾收集器的工作,当这种情况发生时很难影响。
总的来说,这些正是您选择Java技术以避免担心的细节。如果你仍然坚持要担心它们,那么请查看所选servlet容器的文档 - 如果有一种支持的方式来完成你的工作,那么你会发现它存在于那里。这样的东西将是特定于容器的。
Web容器在需要删除servlet时调用destroy方法,例如在停止服务器或取消部署项目时。