Java EE:servlet容器中的垃圾收集

时间:2012-08-08 06:48:16

标签: java-ee servlets garbage-collection

在servlet容器中,servlet“S”被实例化并提供了一些请求。它依赖于对象'O',因此在实例化'S'时它创建了该对象。唯一引用'O'是通过'S'。

在服完前几个请求后,'S'很长时间没有收到任何请求。现在的问题是:'S'会被垃圾收集,而'O'会被垃圾收集吗?

或者换句话说,是否有一些服务器对象'A'引用'S',因为它不会被垃圾收集,无论它是否长时间服务于任何请求?如果有一些这样的对象'A',那么谁指的是'A'所以'A'不是垃圾收集等等?

1 个答案:

答案 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来释放所有内存。