java - GregorianCalendar 上的内存泄漏

标签 java jsp tomcat

出现此错误,JSP 页面变为空白(白色):

Jan 9, 2013 7:30:39 PM org.apache.catalina.loader.WebappClassLoader clearThreadLocalMap SEVERE: The web application [/MyWebApp] created a ThreadLocal with key of type [net.sourceforge.jtds.jdbc.DateTime$1] (value [net.sourceforge.jtds.jdbc.DateTime$1@48a47]) and a value of type [java.util.GregorianCalendar] (value [java.util.GregorianCalendar[time=1357531128420,areFieldsSet=true,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Australia/Sydney",offset=36000000,dstSavings=3600000,useDaylight=true,transitions=142,lastRule=java.util.SimpleTimeZone[id=Australia/Sydney,offset=36000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=9,startDay=1,startDayOfWeek=1,startTime=7200000,startTimeMode=1,endMode=3,endMonth=3,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=1]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2013,MONTH=0,WEEK_OF_YEAR=2,WEEK_OF_MONTH=2,DAY_OF_MONTH=7,DAY_OF_YEAR=7,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=58,SECOND=48,MILLISECOND=420,ZONE_OFFSET=36000000,DST_OFFSET=3600000]]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.

建议的解决方案是:

  • 每次需要Calendar 时使用新的实例

  • 检查 ResultSet.close 中的某些钩子(Hook)是否足以调用 ThreadLocal.remove()

但是,在我们的例子中,我们需要重现错误,因此可以测试修复,而不必无限期地等待错误再次发生。

最佳答案

给定的消息不是问题的原因。

Tomcat 仅通知​​可能存在内存泄漏(这一定不是真的)。每次关机都会出现这个错误(试试看)。

关于java - GregorianCalendar 上的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14235228/

相关文章:

java - 有没有办法用 Tomcat 指定不同的 session 存储?

java - 重构具有许多子类的抽象 Java 类

java - jsp中的动态按钮

java - Tomcat 8 如何设置jarsToSkip

java - Tomcat 主页无法正常显示

java - 如何使用Proguard将测试类从生产版本中排除?

java - 添加滚动到文本区域

jsp - 如何在JSP中添加日期选择器

java - 同一表单中的多个提交按钮调用不同的 Servlet

java - 如何关闭 tomcat 7 中的 jul 日志格式?