我的朋友在服务器上安装了我的应用程序(使用Eclipse Kepler 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>发布于 2014-05-13 14:42:46
您不需要将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?
其次,当我运行应用程序时,我收到消息"Context Created“,但是当我关闭应用程序时,我没有收到消息"Context Destroyed”(我只需关闭浏览器即可做到这一点)。
简单地关闭浏览器并不会破坏上下文。应用程序上下文不仅用于每个客户端,而且在整个应用程序范围内使用。您可以为每个客户端使用一个HTTP会话。
当服务器以标准方式正常停止时,方法contextDestroyed()将被调用。
有关更多信息,请查看下面的帖子
如何销毁上下文?
理想情况下,当应用程序服务器(Tomcat或JBoss)关闭或有时甚至重新启动时,ServletContext会被销毁。
请看下面的链接:
https://stackoverflow.com/questions/23620580
复制相似问题