0

我们有一个常量类,它在枚举类中有一个 jsps/servlet 列表。此类从控制器 servlet 中用作重定向。这个特定的类总是在内存分析器中显示为泄漏可疑。

我在这里粘贴来自控制器 servlet 的代码:

 protected void forwardPage(Page jspPage, boolean checkTrail, HttpServletRequest request, HttpServletResponse response) {
 String temp;
 String str = new String();

 str = jspPage.name();

Page page1 =  Page.valueOf(Page.class,str);
    try {
        temp = page1.getFileName();
        getServletContext().getRequestDispatcher(temp).forward(request, response);  
    } catch (Exception se) {
    } finally { 
        page1 = null;
        jspPage = null;
        str = null;
        temp = null;
    }

页面本身是一个枚举类,具有这样的代码..

UPDATE_PROFILE_CONFIRM("/WEB-INF/jsp/login/updateProfileConfirm.jsp", "确认您的个人资料") public String getTitle() {

    return this.title;
}


public String getFileName() {
    return this.fileName;
}

public void setFileName(String newFileName) {
    this.fileName = newFileName;
}

我无法理解的是为什么这个类应该泄漏?一旦我删除 Page 的引用并直接重定向,问题似乎就消失了。没有框架,简单的 servlet-jsp 框架。应用程序服务器是 Tomcat 6 和 JDK 6。

4

1 回答 1

5

我怀疑由于枚举有 301 个值,因此该枚举的 301 个实例总是在 ram 中,这是正常的,因为这些实例静态链接到枚举类。这不是泄漏,这就是枚举的工作方式。

内存分析器只是告诉你有 13,244 个字节无法回收,这可能会显示为泄漏,但事实并非如此。奇怪的是它不知道枚举,可能根本没想到一个枚举有301个包含很多字节的值,通常枚举有几个元素,存储有限数量的值,但是有一个像这样的枚举并没有错你的“页面”。

于 2012-08-01T03:25:48.980 回答