Estou usando o Tomcat 6.0, o JDK 1.6 para um aplicativo da Web.
Está morrendo com frequência exigindo reinicializações manuais, e o arquivo de log mostra isso:
Notice: Maximum number of threads (200) created for connector with address null and port 80
Seguido por isso:
Notice: Waiting for 200 instance(s) to be deallocated
Seguido por 200 linhas deste:
Severe: The web application [] is still processing a request that has yet to finish. This is very likely to create a memory leak. You can control the time allowed for requests to finish by using the unloadDelay attribute of the standard Context implementation.
Seguido por 200 linhas deste:
Severe: The web application [] created a ThreadLocal with key of type [net.sourceforge.jtds.jdbc.DateTime$1] (value [net.sourceforge.jtds.jdbc.DateTime$1@1d51620]) and a value of type [java.util.GregorianCalendar] (value [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,minimalDaysInFirstWeek=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]]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.
Eu vejo isso como o GregorianCalendar
está vazando, e não está sendo gc como de costume.
O site frequentemente cria instâncias de GregorianCalendar, adiciona alguns meses ou anos, formata a Data resultante e imprime o valor para o usuário. No entanto, eu esperaria que a instância GregorianCalendar fosse marcada para coleção assim que o servlet concluísse seu método de tratamento de solicitação.
O que está acontecendo?