【发布时间】:2014-05-12 23:31:51
【问题描述】:
我的朋友在服务器上设置了我的应用程序(使用 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”?
其次,当我运行应用程序时,我收到消息“上下文已创建”,但是当我关闭应用程序时没有收到消息“上下文已销毁”(我只需关闭浏览器即可)。如何销毁上下文?
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>
【问题讨论】:
-
题外话:你对
@WebServlet的用法是错误的。 -
您必须提供更多日志。如果由 Servlet 容器管理,此类中的任何内容都不会导致内存泄漏。
-
嗨 Sotirios,我已将“@WebServlet”更改为“@WebListener”。谢谢你。我还向我的朋友索要服务器日志的副本。我会尽快发布。问候,格林
-
嗨,Sotirios,我已经和我的朋友谈过了,他没有任何进一步的信息。我会研究我能跑什么。问候,格林。
-
嗨 Sotirios,我现在已经安装了 JProfiler。有很多选项(实时内存、堆遍历器、CPU 视图、线程、监视器和锁、遥测、数据库、JEE 和探测器)。我需要记录哪些?问候,格林。
标签: java eclipse tomcat gwt memory-leaks