首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GWT Java -内存泄漏- ServletContextListener问题

GWT Java -内存泄漏- ServletContextListener问题
EN

Stack Overflow用户
提问于 2014-05-13 07:31:52
回答 1查看 629关注 0票数 0

我的朋友在服务器上安装了我的应用程序(使用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”(我只需关闭浏览器即可做到这一点)。我怎样才能破坏上下文?

代码语言:javascript
复制
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:

代码语言:javascript
复制
<listener> 
     <listener-class> 
         org.AwardTracker.server.ServletContextImpl 
     </listener-class> 
</listener>
EN

回答 1

Stack Overflow用户

发布于 2014-05-13 14:42:46

您不需要将ServletContext作为ServletContextImpl类的实例成员。

当你需要它的时候,只需从ServletContextEvent访问它,因为你已经在下面的代码中这样做了:

代码语言:javascript
复制
context = contextEvent.getServletContext(); 

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

代码语言:javascript
复制
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会被销毁。

请看下面的链接:

  • When ServletContext is initialized
  • When is a servletcontext destroyed?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23620580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档