Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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
GWT Java-内存泄漏-ServletContextListener问题_Java_Eclipse_Tomcat_Gwt_Memory Leaks - Fatal编程技术网

GWT Java-内存泄漏-ServletContextListener问题

GWT Java-内存泄漏-ServletContextListener问题,java,eclipse,tomcat,gwt,memory-leaks,Java,Eclipse,Tomcat,Gwt,Memory Leaks,我的朋友在服务器上安装了我的应用程序(使用Eclipse Kepler Service Release 2、GWT 2.6.0、Tomcat 6开发——下一个版本,我正在测试的是Tomcat 7),我收到了他的消息: “当我在Apache Tomcat中运行诊断程序时收到以下消息,您是否可以检查应用程序中是否存在内存泄漏: 下列web应用程序已停止(重新加载、取消部署),但其 以前运行的类仍然加载在内存中,因此导致内存不足 泄漏(使用探查器确认): /奖赏追踪器“ 所以我调查发现,我需要使用Se

我的朋友在服务器上安装了我的应用程序(使用Eclipse Kepler Service Release 2、GWT 2.6.0、Tomcat 6开发——下一个版本,我正在测试的是Tomcat 7),我收到了他的消息: “当我在Apache Tomcat中运行诊断程序时收到以下消息,您是否可以检查应用程序中是否存在内存泄漏: 下列web应用程序已停止(重新加载、取消部署),但其

以前运行的类仍然加载在内存中,因此导致内存不足 泄漏(使用探查器确认): /奖赏追踪器“

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

我有两个问题

首先,我应该在“context.setAttribute(“TEST”,“TEST_VALUE”);”行中放置什么来代替“TEST”和“TEST_VALUE”

其次,当我运行应用程序时,我会收到消息“Context Created”,但是当我关闭应用程序时,我不会收到消息“Context destromed”(我通过简单地关闭浏览器来实现这一点)。我怎样才能破坏上下文

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>

org.AwardTracker.server.ServletContextImpl

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

无论何时需要它,只要从
ServletContextEvent
访问它,因为您已经在下面的代码中进行了操作:

context = contextEvent.getServletContext(); 

在应用程序中,您可以通过访问
ServletContext

有关更多信息,请查看


其次,当我运行应用程序时,我会收到消息“Context Created”,但当我关闭应用程序时,我不会收到消息“Context Destroyed”(我只需关闭浏览器即可完成此操作)。

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

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

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


如何破坏上下文?

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

请查看以下链接:


离题:您使用的
@WebServlet
是错误的。您必须提供更多日志。如果由Servlet容器管理,则此类中的任何内容都不会导致内存泄漏。嗨,Sotirios,我已将“@WebServlet”更改为“@WebListener”。非常感谢。我还要求我的朋友提供服务器日志的副本。我会尽快把它寄出去。你好,GlynHi Sotirios,我已经和我的朋友谈过了,他没有任何进一步的信息。我会调查我能跑什么。你好,格林。你好,索蒂里奥斯,我现在已经安装了JProfiler。有许多选项(实时内存、堆遍历器、CPU视图、线程、监视器和锁、遥测、数据库、JEE和探测器)。我需要记录以下哪一项?你好,格林。你好,布拉吉,非常感谢。首先,从我所有的阅读来看,我仍然认为我对ServletContext的理解有一个很大的漏洞。我的理解是,我添加此功能是为了帮助防止内存泄漏。我现在明白了,无论正确与否,它都是从服务器开始和结束的,在应用程序的生命周期中不需要与服务器进行任何交互(即,除了Servlet中已经完成的调用之外,代码中没有其他调用。哪种类型的对象即使在关闭服务器后仍在内存中?
ServletContext
用于从web.xml读取一些初始参数,并在应用程序启动或建立数据库连接或任何预热时一次性读取属性文件活动是在
contextInitialized()
方法中执行的。同样,您可以在
contextdestromed()
中释放数据库连接或其他外部获取的资源。其次,您的问题提示了我正确的方向。最初我认为如前所述“我关闭应用程序”(我通过简单地关闭浏览器来实现这一点)”。事后来看,并回顾第一点,这是不正确的。当我停止服务器时,应用程序将完成。然后,当我停止服务器时,会显示消息“Context Destroyed”。因此,这就留下了与“Context.setAttribute(“TEST”,“TEST_VALUE”);相关的问题。这是必需的,如果是,当前属性是否正确,或者我是否应该将它们设置为其他属性?再次感谢您的帮助。尊敬的Glyn。您正在应用程序上下文中设置一个键值,该键值将一直显示到应用程序的生命周期,直到上下文被破坏。如果您想释放内存,则可以如果需要或根本不需要,将其设置为
null
。现在它取决于值。值有多复杂?或大小如何?
ServletContext context = request.getSession().getServletContext();