servlet处理请求后,是否会立即进行垃圾回收 ?或者它是否会活了一段时间,期待可能会有一些请求?
如果servlet立即死亡,那么对于随后的请求是可惜的。
如果servlet存在很长时间,可能会浪费资源。
所以我认为这是一个很平衡的问题。有没有办法决定/配置servlet处于空闲状态后应该存在多长时间?
答案 0 :(得分:2)
最初没有加载Servlet。在应用程序启动后第一次收到Servlet时会加载Servlet。
它可能会也可能不会从内存中删除(已卸载)。 这取决于Servlet容器(如Tomcat / JBoss)这些容器决定servlet应该在内存中保留多长时间。
如果 Servlet空闲(即没有请求到达)时间太长,容器可能会从内存中卸载。
但现在让我们说在卸载后,另一个请求到达servlet。 然后再次,Container将Servlet加载到内存中。这并不会影响WebApplication功能。因为每个请求都在一个单独的线程上处理。没有两个请求相互依赖。
您无法决定何时在作业任务属于Web容器的内存中卸载或加载Servlet。像Tomcat / Jboss / Glasssfish一样。
这就是为什么你有像ServletRequestListner,ServletResponseListner这样的监听器,它可以帮助你在创建和销毁诸如Servlet / Request / Response Objects之类的事件时做一些事情,因为这些事件不在你的控制之下。
答案 1 :(得分:1)
在Servlet生命周期结束时调用 destroy()方法。
之后,servlet对象被标记为垃圾回收。
并且正如@Oliver所说,是由容器来决定何时调用destroy方法并将Servlet标记为垃圾收集。
请参阅此答案here以查看调用servlet destroy()方法的原因。
希望有助于。
答案 2 :(得分:1)
Java Servlet规范中阐明了Servlet的生命周期。对于版本4,请参见JSR 369。该文档将由Jakarta.ee spec取代,但该规范目前为空白,只有封面和许可声明。
➥一个servlet容器可以选择在第一个请求到达之前加载servlet 。否则容器可能会等到第一个请求到达时才需要。
第2.3节* Servlet生命周期,第2.3.1节加载和实例化内容如下:
servlet容器负责加载和实例化servlet。加载和实例化可以在容器启动时发生,也可以延迟到容器确定需要servlet来处理请求时进行。
启动servlet引擎时,必须由servlet容器定位所需的servlet类。 servlet容器使用普通的Java类加载工具来加载servlet类。加载可能来自本地文件系统,远程文件系统或其他网络服务。
在加载Servlet类之后,容器将其实例化以供使用。
➥servlet容器可以选择保留任意时间段加载的servlet。 Servlet可能会保持连续加载,也可能会终止(可能在空闲时或内存不足时结束)。
如果在结束servlet之后有新的请求到达,则servlet容器再次加载servlet。没问题。
要引用规范,请参见2.3.4 服务终止:
不需要servlet容器在任何特定时间段内都保持servlet的加载。 servlet实例可以在servlet容器中保持活动状态达毫秒的时间,也可以是servlet容器的生命周期(可能是几天,几个月或几年),或者介于两者之间的任何时间。
当Servlet容器确定应从服务中删除Servlet时,它将调用Servlet接口的destroy方法以允许Servlet释放其正在使用的任何资源并保存任何持久状态。例如,当容器要节省内存资源或将其关闭时,可以执行此操作。
在servlet容器调用destroy方法之前,它必须允许servlet的service方法中当前正在运行的任何线程完成执行,或超过服务器定义的时间限制。
一旦在Servlet实例上调用了destroy方法,则容器可能不会将其他请求路由到该Servlet实例。如果容器需要再次启用Servlet,则必须使用该Servlet类的新实例来实现。
destroy方法完成后,servlet容器必须释放servlet实例,以便有资格进行垃圾回收。
关于您的观点:
在servlet处理请求之后,会立即对其进行垃圾回收吗?还是它还活着一段时间,期待可能会出现一些请求?
如果servlet立即死亡,那么对于随后的请求很遗憾。
...这是Servlet容器的业务。不为您担心。作为Servlet程序员,您需要知道的是,当用户的请求到达时,您的Servlet实例将被加载并准备就绪。其余的取决于容器来管理。
发明Java Servlet规范的全部目的是使您摆脱这些担忧。让容器运行节目是使编写Java Servlet相对简单的原因,这是将“ let”放在“ servlet”中的原因。您并不是在编写功能完善的服务器,而只是编写一小块功能以适合大型的已运行服务器。
您问:有什么方法可以决定/配置servlet处于空闲状态后应该存活多长时间?
尽管每个Servlet容器实现都可以自由提供其自身的功能,但Servlet标准未指定任何此类选项,但标准所要求的功能除外。研究您特定的servlet容器的文档。