Java 枚举类上的内存泄漏
我们有一个constants类,它在enum类中有一个JSP/servlet列表。此类从控制器servlet用作重定向。这个特殊的类总是在内存分析器中显示为泄漏可疑 我将控制器servlet中的代码粘贴到这里: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
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;
}