2012-08-01 124 views
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 /登录/ updateProfileConfirm.jsp”,‘确认您的个人资料’) 公共字符串的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.

+1

为什么用'new String()'初始化'String str'?为什么不让它成为'String pageName = jspPage.name();'或者就此而言,为什么要把它作为一个变量出来呢? 'jspPage.name()'是非常好的自我文档。 – 2012-08-01 02:07:54

+0

好吧..这是真的,但我不认为这本身可以导致任何泄漏。 – user546352 2012-08-01 02:21:41

+0

“这个特定的类总是在内存分析器中显示为泄漏可疑。”你是指页面枚举?它是否告诉你堆中有多少个实例? – 2012-08-01 02:23:33

回答

4

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

内存分析器只是告诉你,有13,244字节无法回收,可能会出现泄漏,但事实并非如此。奇怪的是,它不知道枚举,可能根本没有预料到一个枚举有301个值包含大量的字节,通常枚举有几个元素,存储有限的值,但没有什么错误,像一个枚举类似你的“页面”。

+0

问题是,当我删除此页面引用并直接从其中一个高频servlet向前转到jsp页面时,系统似乎表现良好? – user546352 2012-08-01 03:28:58

+0

这可能是因为enum没有被其他地方使用(?)然后它不会被类加载器加载。 – 2012-08-01 05:37:30

+0

@ TonyLampada你认为将这个类作为初始化的一部分调用会对它产生影响吗? – user546352 2012-08-01 12:49:17