Vazamento de memória no Tomcat

2

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?

    
por bdares 13.12.2011 / 07:06

1 resposta

4

Provavelmente não é um vazamento de memória ... Seu Pool de encadeamentos do conector é de tamanho 200 (padrão) e todas as 200 conexões estão em uso, isso mostra que você tem 200 solicitações que não foram finalizadas ... O restante dos registros porque você pára o Tomcat com essas 200 solicitações pendentes ... Então a questão é por que suas solicitações não estão respondendo? Você pode fazer um threaddump para ver onde as solicitações estão bloqueadas ...

    
por 13.12.2011 / 10:16