我对servlet容器生命中的这种特殊情况感到好奇。假设我们为servlet容器分配了一些内存以加载servlet(类)。现在在特定时间内存已满,容器必须加载新的servlet。在这种情况下,当一个加载的容器用任何算法取出时(如果你可以分享的话,我也很高兴),并用所需的servlet替换。这到底发生了什么?是否调用了destroy方法?好奇心背后的原因是,当重新加载替换的servlet时,是第二次调用init()方法吗?
答案 0 :(得分:0)
仅仅因为内存已满而没有从内存中卸载Servlet。事实上,Servlet对象通常很小,通常没有任何成员变量,因为状态完全存储在servlet处理的请求/响应对象中。通常,在任何时候只分配每个servlet的一个实例。
这基本上使您的其余问题无效。只有在取消部署Web应用程序时才会卸载servlet。当发生这种情况时,确实会调用destroy
。但是,对于OutOfMemory
条件,通常不能再执行任何操作(因为可以收集垃圾的所有内容都已收集),因此您无法依赖于destroy
被调用没有留下任何记忆。但是,你已经猜到了,当没有更多的记忆时,init
将不会被再次调用,因为没有空间来初始化更多的对象。
重新部署Web应用程序时,将在取消部署的servlet上调用destroy
,并在首次使用新部署的servlet之前调用init
。
确定释放哪些对象的算法是垃圾收集器的算法(可配置)。但它只会收集未使用过的(&#34;垃圾&#34;,#34;未引用的&#34;)对象,不是随机使用的随机Servlet。< / p>