我用的server是tomcat,当我在ie上运行servlet程序,关闭ie或者关闭tomcat都不能测试到其destroy()被执行。我在destroy()中设定在日志文件输出执行信息。所以如果destroy()被执行,查看日志文件应该可以发现的!
请您帮我忙!

解决方案 »

  1.   

    应该是在tomcat关闭的时候!你是怎么关闭tomcat的?要用shutdown.bat关闭。
      

  2.   

    Servlet引擎卸载Servlet之前,调用destroy方法使Servlet进行必要的整理工作。
      

  3.   

    非常感谢大家,特别是jtzwm,我的确是没有用shutdowm.dat来关闭tomcat.而是直接在tomcat窗口中叉掉。谢谢!
    不过我还有一点不明白:如果destroy()只在tomcat关闭时才执行,那不是只要客户端运行servlet,在服务器端都会有实例在运行,所有的实例都只能等到服务器关闭时才会全部执行destroy(),这样的话服务器开的时间越长,其上运行的实例不是越来越多?哪怕客户端早已不再执行该servlet.
      

  4.   

    java中不是有垃圾处理器吗,我想可以自动处理程序中的无用的实例,回收内存。至于服务器,我想也是相应在运行的实例。
    =============================================
    不知道这样解释对不对?我也在学习。:)
      

  5.   

    Servlet是用来产生response的,并不是每个客户端都对应一个单独的Servlet。所以不会出现实例越来越多的情况。
      

  6.   

    songyangaaron说的我明白。对于一个servlet程序,不管客户端执行多少次或有多少客户端执行,服务器上都只有一个。但你们有没有发现,如果用HttpSession来观察不同客户端对同一个servlet调用的会话,你会发现运行一次,service()的个数会增加一个,新开一个会话,HttpSession的个数会增加一个,这些计数只会增加不会减少,除非你关闭服务器,它才会从头开始计数,即使你关闭你打开的会话也是如此。这样的话服务器上运行的各种方法和对象(比如上面说到的service()和HttpServlet)不是越来越多吗?
      

  7.   

    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.util.*;public class cc extends HttpServlet
    {
    static final String hash="wangjing";
    private int servicecounter=0;protected synchronized void entering(){
    servicecounter++;
    }public void service(HttpServletRequest req,HttpServletResponse rep) throws ServletException,IOException
    {
       entering(); 
       HttpSession session=req.getSession(true);
        String id=session.getId();
      System.out.println("num="+servicecounter);
      System.out.println("id="+id);
       Hashtable table=(Hashtable)session.getAttribute(hash);
       if(table==null)
       {
          table=new java.util.Hashtable();
          session.setAttribute(hash,table);
       }   Object seb;
       int code;
       seb=new Object();
       code=seb.hashCode();
       table.put(new Integer(code),seb);
       System.out.println(code);
       int d=table.size();
       System.out.println("hash_size="+d);
    }
    }
      

  8.   

    songyangaaron的意思是不是计数的增加只是表示这个方法比如service()被执行的次数在增加,而不是表示service()的实例个数在增加?这个我理解了!
    可是程序中
       HttpSession session=req.getSession(true);
        String id=session.getId();
        System.out.println("id="+id);
    仍然说明内存中的SESSION 个数在增加呀?因为只要你执行一次该程序,产生一个id号,以后不关闭IE,即使在IE上浏览别的许多网页后再来重新执行该程序,仍是前面产生的id号。所以只要你打开一个新的IE执行一次该程序,在服务器上就产生一个新的session及其id号!这样客户端运行的session越多服务器上保存的session实例不是就越多吗?
    我现在不知道用什么方法可是测到当前servlet环境下有关于一个servlet程序的多少个session实例在运行?这样的话也许可以直观地看出这个问题!
      

  9.   

    session有默认存在时间,一般是半小时。
    也可以设置。
    超过这个时间,session就会自动销毁。