2012-08-01 35 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