Java 枚举类上的内存泄漏

Java 枚举类上的内存泄漏,java,jsp,tomcat6,memory-leaks,Java,Jsp,Tomcat6,Memory Leaks,我们有一个constants类,它在enum类中有一个JSP/servlet列表。此类从控制器servlet用作重定向。这个特殊的类总是在内存分析器中显示为泄漏可疑 我将控制器servlet中的代码粘贴到这里: protected void forwardPage(Page jspPage, boolean checkTrail, HttpServletRequest request, HttpServletResponse response) { String temp; String

我们有一个constants类,它在enum类中有一个JSP/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\u PROFILE\u CONFIRM(“/WEB-INF/jsp/login/updateProfileConfirm.jsp”,“确认您的配置文件”) 公共字符串getTitle(){


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

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


Memory analyzer只是告诉您有13244个字节无法回收,这可能看起来像是泄漏,但事实并非如此。奇怪的是,它不知道枚举,可能只是不希望枚举有301个包含大量字节的值,通常枚举有几个元素,存储有限的值,但是没有有一个像你的“页面”一样的枚举没有什么错。

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


Memory analyzer只是告诉您有13244个字节无法回收,这可能看起来像是泄漏,但事实并非如此。奇怪的是,它不知道枚举,可能只是不希望枚举有301个包含大量字节的值,通常枚举有几个元素,存储有限的值,但是没有有一个像“Page”这样的枚举没有什么错。

为什么要用
new String()
初始化
String str
是一个非常好的自我文档。好吧..这是真的,但我认为它本身不会导致任何泄漏。“这个特定的类在内存分析器中总是显示为泄漏可疑。”你指的是页面枚举吗?它告诉你堆中有多少实例吗?还有,为什么你把一个页面作为参数,把它改成字符串,然后再转换回页面?这样做毫无意义。@SimoneGianni是的,它抱怨页面枚举。它告诉我,每个实例都有301个实例大小为44总大小为13244为什么要用
new String()
初始化
String str
?为什么不将其设置为
String pageName=jspPage.name();
或者,为什么要将其作为变量拉出?
jspPage.name()
是一个非常好的自我文档。好吧..这是真的,但我认为它本身不会导致任何泄漏。“这个特定的类在内存分析器中总是显示为泄漏可疑。”你指的是页面枚举吗?它告诉你堆中有多少实例吗?还有,为什么你把一个页面作为参数,把它改成字符串,然后再转换回页面?这样做毫无意义。@SimoneGianni是的,它抱怨页面枚举。它告诉我,每个实例都有301个实例大小为44总大小为13244问题是,当我从一个高频servlet中删除此页面引用并直接使用forward to the jsp页面时,系统似乎运行良好?这可能是因为枚举没有在其他任何地方使用(?)那么它就不会被类加载器加载。@TonyL–mpada您认为在初始化过程中调用这个类会对这一点产生影响吗?问题是,当我删除这个页面引用并从一个高频servlet直接使用forward到jsp页面时,系统似乎运行良好?这可能是因为m没有在其他任何地方使用(?),那么它就不会被类加载器加载。@TonyL–mpada您认为在初始化过程中调用这个类会对它产生影响吗?
    return this.title;
}


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

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