GWT Java - 内存泄漏 - ServletContextListener问题

时间:2014-05-12 23:31:52

标签: java eclipse tomcat gwt memory-leaks

我的朋友在服务器上设置了我的应用程序(使用Eclipse Kepler Service Release 2,GWT 2.6.0,Tomcat 6开发 - 下一个版本,我正在测试的将是Tomcat 7),我收到了这个来自他的消息: “您可以检查应用程序中是否存在内存泄漏,因为我在Apache Tomcat中运行诊断时收到此消息: 以下Web应用程序已停止(重新加载,取消部署),但是

以前运行的

类仍然会加载到内存中,从而导致内存 泄漏(使用分析器确认): / awardtracker“

所以我调查并发现我需要使用ServletContextListener来清理那些引用。所以我找到了一个例子;请看下面。

我有两个问题。

首先,我应该在“context.setAttribute(”TEST“,”TEST_VALUE“)行中加入什么内容;”代替“TEST”和“TEST_VALUE”?

其次,当我运行应用程序时,我收到消息“Context Created”但是当我关闭应用程序时我没有收到消息“Context Destroyed”(我这样做只需关闭浏览器)。我怎样才能破坏背景?

package org.AwardTracker.server;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebServlet;

/**
 * Servlet implementation class ServletContextImpl
 */
@WebServlet("/ServletContextImpl")

public class ServletContextImpl implements ServletContextListener{ 

 ServletContext context; 

 public void contextInitialized(ServletContextEvent contextEvent) { 

     System.out.println("Context Created"); 

     context = contextEvent.getServletContext(); 

     // set variable to servlet context 

     context.setAttribute("TEST", "TEST_VALUE"); 

 } 

 public void contextDestroyed(ServletContextEvent contextEvent) { 

     context = contextEvent.getServletContext(); 

     System.out.println("Context Destroyed"); 

 }

}

和xml:

<listener> 
     <listener-class> 
         org.AwardTracker.server.ServletContextImpl 
     </listener-class> 
</listener>

1 个答案:

答案 0 :(得分:0)

您不需要ServletContext作为ServletContextImpl课程的实例成员。

只要您需要它,只需从ServletContextEvent访问它,就像您在下面的代码中所做的那样:

context = contextEvent.getServletContext(); 

在应用程序中,您可以通过HttpSession#getServletContext()访问ServletContext

ServletContext context = request.getSession().getServletContext();

有关详细信息,请查看How to get the Servlet Context from ServletRequest in Servlet 2.5?


其次,当我运行应用程序时,我会收到消息&#34; Context Created&#34;但是我没有收到消息&#34; Context Destroyed&#34;当我关闭应用程序时(我只需关闭浏览器即可)。

简单地关闭浏览器并不会破坏上下文。应用程序上下文不仅适用于每个客户端。您可以为每个客户端使用HTTP会话。

当服务器以标准方式正常停止时,将调用方法contextDestroyed()

欲了解更多信息,请查看以下帖子


如何破坏上下文?

理想情况下,当App服务器(Tomcat或JBoss)关闭或有时甚至重新启动时,ServletContext会被破坏。

请看下面的链接: