Após dar “start” e “stop” algumas vezes em uma aplicação usando o VRaptor 2.6.2, no Tomcat 7.0.14 (num Ubuntu 10.10 32-bit, com a JVM da Sun, versão 1.6.0 update 24), recebo um OutOfMemoryError, reclamando que não há espaço no PermGen.
Na saída do Tomcat, parece que o culpado é uma classe do VRaptor, o org.vraptor.url.DefaultViewLocator:
Sep 7, 2011 2:16:24 AM org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks
SEVERE: The web application [] created a ThreadLocal with key of type [org.picocontainer.DefaultPicoContainer.IntoThreadLocal] (value [org.picocontainer.DefaultPicoContainer$IntoThreadLocal@6dd138]) and a value of type [java.lang.Class] (value [class org.vraptor.url.DefaultViewLocator]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
(repetido diversas vezes)
Ligando um profiler na aplicação (YourKit 9.5.6, fazendo profiling remoto, sendo que a JVM foi inicializada com o agent instalado), após um ciclo start/stop no Tomcat, vejo que sobra uma instância do WebappClassLoader do Tomcat, que não morre mesmo após inúmeros Full GC.
Com o profiler, dá pra ver que há dois caminhos somente com strong references que levam ao WebappClassLoader, e eles são:
Thread(“http-bio-8080-exec-14”).threadLocals.table[0].value ==> DefaultViewLocator (cujo ClassLoader é WebappClassLoader)
Thread(“http-bio-8080-exec-14”).threadLocals.table[0].value ==> Protection domain of DefaultViewLocator (cujo ClassLoader é WebappClassLoader)
Parece então que o VRaptor registra o DefaultViewLocator como ThreadLocal em algum dos worker threads (que atendem requisições http) do Tomcat, e esquece de tirar.
Pessoal da Caelum, vcs confirmam esse bug? Já foi corrigido? Tem planos de corrigir?
Pesquisei bastante no Google e não encontrei em lugar nenhum o código fonte do VRaptor 2.6.2. O mais próximo que encontrei foi um SVN aparentemente abandonado no qual o pom.xml declara a versão 2.6.1-SNAPSHOT. Encontrei outro SVN com a versão 2.6.0. No site de vocês não tem absolutamente nada sobre o VRaptor 2.
Aguardo resposta,
Bruno