在servlet容器中,servlet“S”被实例化并提供了一些请求。它依赖于对象'O',因此在实例化'S'时它创建了该对象。唯一引用'O'是通过'S'。
在服完前几个请求后,'S'很长时间没有收到任何请求。现在的问题是:'S'会被垃圾收集,而'O'会被垃圾收集吗?
或者换句话说,是否有一些服务器对象'A'引用'S',因为它不会被垃圾收集,无论它是否长时间服务于任何请求?如果有一些这样的对象'A',那么谁指的是'A'所以'A'不是垃圾收集等等?
答案 0 :(得分:1)
你的问题没有完美的答案。 Servlet 3.0规范中的2.3.4节规定:
servlet容器不需要为任何servlet容器加载servlet 特定的时间段。 servlet实例可以在a中保持活动状态 servlet容器,持续时间为毫秒 servlet容器(可能是几天,几天或几天 几年),或两者之间的任何时间。
当servlet容器确定应该删除servlet时 从服务中,它调用Servlet接口的destroy方法 允许servlet释放它正在使用的任何资源并保存任何资源 持久的状态。例如,容器可以在此时执行此操作 想要节省内存资源,或者当它被关闭时。
所以它在很大程度上取决于容器本身。有些人可能会提供配置功能,以便在一段时间不活动后卸载servlet(我不知道,但从来没有需要这样的功能)。
<强>结论强>
在服完前几个请求后,'S'没有收到任何请求 需很长时间。现在问题是:'S'会被垃圾收集, 和'O'一起吗?
Servlet本身的垃圾收集取决于容器,应该在调用javax.servlet.Servlet.destroy()
之后进行。之后,servlet'S'应该标记为GC - 包括所有引用的对象'O'(只要那些没有在其他地方被引用)。同样,它取决于容器实现。
国际海事组织,这在现实中并不重要。你应该始终认为servlet只是容器存在,并且停止容器通常会通过停止JVM来释放所有内存。