我们有一个常量类,它在枚举类中有一个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;
}
Page本身是一个包含类似代码的枚举类。
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。
答案 0 :(得分:5)
我怀疑由于枚举有301个值,因此在枚举中总有301个枚举实例,这是正常的,因为这些实例静态链接到枚举类。这不是泄密,而是枚举的工作方式。
内存分析器只是告诉你有13,244个字节无法回收,这可能会显示为泄漏,但事实并非如此。奇怪的是,它不知道枚举,可能只是没想到枚举有301个值包含很多字节,通常枚举有一些元素,存储有限数量的值,但是有一个枚举像是没有错你的“页面”。