Tomcat 中的内存泄漏

Tomcat 中的内存泄漏

我正在使用 Tomcat 6.0、JDK 1.6 开发 Web 应用程序。

它经常死机需要手动重启,日志文件显示以下内容:

注意:为地址为 null 且端口为 80 的连接器创建的最大线程数(200)

接下来是:

通知:正在等待 200 个实例被释放

接下来是 200 行内容:

严重:Web 应用程序 [] 仍在处理尚未完成的请求。这很可能造成内存泄漏。您可以使用标准 Context 实现的 unloadDelay 属性来控制允许请求完成的时间。

接下来是 200 行内容:

严重:Web 应用程序 [] 创建了一个 ThreadLocal,其键类型为 [net.sourceforge.jtds.jdbc.DateTime$1](值 [net.sourceforge.jtds.jdbc.DateTime$1@1d51620]),值类型为 [java.util.GregorianCalendar](值 [java.util.GregorianCalendar[time=1304607600000,areFieldsSet=true,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Seoul",offset=32400000,dstSavings=0,useDaylight=false,transitions=14,lastRule=null],firstDayOfWeek=1,m inimalDaysInFirstWeek=1,ERA=1,YEAR=2011,MONTH=4,WEEK_OF_YEAR=19,WEEK_OF_MONTH=1,DAY_OF_MONTH=6,DAY_OF_YEAR=126,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=32400000,DST_OFFSET=0]]),但在 Web 应用程序停止时未能将其删除。这很可能造成内存泄漏。

我发现这是在GregorianCalendar泄漏,并且没有像往常一样进行 gc。

该网站确实经常创建 GregorianCalendar 实例,添加几个月或几年,格式化结果日期,并将值打印给用户。但是,我希望在 servlet 完成其请求处理方法后立即将 GregorianCalendar 实例标记为可收集。

这是怎么回事?

答案1

这可能不是内存泄漏... 您的连接器线程池大小为 200(默认),并且所有 200 个连接都在使用中,这表明您有 200 个请求未终止... 其余日志是因为您在有这 200 个待处理请求时停止了 Tomcat... 所以问题是为什么您的请求没有响应? 您可以进行线程转储以查看请求被阻止的位置...

相关内容