Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 服务器创建的实例何时死亡?_Java_Multithreading_Jakarta Ee_Servlets_Persistence - Fatal编程技术网

Java 服务器创建的实例何时死亡?

Java 服务器创建的实例何时死亡?,java,multithreading,jakarta-ee,servlets,persistence,Java,Multithreading,Jakarta Ee,Servlets,Persistence,以下节目: public class SimpleCounter extends HttpServlet { int counter=0; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/

以下节目:

public class SimpleCounter extends HttpServlet {

    int counter=0;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/plain");
        PrintWriter writer = response.getWriter();
        counter++;
        writer.println("accessed " + counter + " times" );
    }
}
每次访问此servlet的url时,打印计数器的增量值。我读到服务器创建了这个servlet的一个实例,每当有对这个servlet的请求时,一个新线程就会将这个请求映射到服务器创建的特殊实例


服务器创建的实例(请求映射到哪个线程)何时死亡?新请求创建的线程何时死亡?

servlet实例是在您的webapp启动时创建的,或者是在首次需要时创建的(如果设置了lazy init)。当你的webapp停止时,当它被GCed时,它被处理掉。在正常的生产环境中,我敢说这种情况从未真正发生过(不包括部署新版本)

大多数(如果不是全部的话)servlet容器都使用线程池。这意味着它们重用线程来处理请求。所以这些线永远不会死;当完成请求执行后,它们返回池

当然,当您关闭服务器时,它们确实会死亡:)


从应用程序的角度来看,您确实应该尝试使servlet无状态,并且可以安全地考虑每个请求都是在它自己的专用线程中执行的。

“您确实应该尝试使servlet无状态”。您能解释一下吗?这意味着您不应该在其中保留任何应用程序状态。这样你就不必在意它是何时被创建或销毁的。理想情况下,你甚至不应该关心实例化了多少实例(这在集群环境中很有用)。@SuhailGupta,简单地说,不要在servlet中使用任何静态变量。@Joeri Hendrickx如果实例在应用程序关闭时被销毁,那么可能有许多实例处于活动状态,其中一些可能保持“空闲”。如果发生这种情况,会不会造成负担?@SuhailGupta在正常的现实生活环境中,只有当你停止服务器时,应用才会停止。那你就不在乎了。您决不会仅仅为了好玩而在生产服务器上部署/取消部署应用程序。在开发期间,这可能是一个问题,但通常GC会为您清理实例。解决这个问题的唯一方法是创建内存泄漏(将对servlet的引用放在容器中),然后重新部署应用程序?有些应用程序,如Google App Engine,会主动回收一段时间内未收到请求的应用程序。@Mike Samuel实际上没有。但可包括在与以下内容相关的回答/讨论中: