Leak no java.util.logging

oi pessoal

eu falei ontem com muita gente, que estava com um problema com o garbage collector numa aplicacao web.
depois de procurar muito, descobri que minha session tinha 600 minutos, q sao 10 horas de milhares de usuarios logados no seu tomcat. muita gente usa o sistema, entao a aplicacao batia 100 megas em menos de uma hora. mudei o timeout, melhorou bastante.

Mesmo assim a memoria ia aumentando vagarosamente.

Ai descobri o vilao: a api de logging do java 1.4.

Bem, eu crio MUITOS loggers, um para cada usuario (100 usuarios acessam em uma hora). e eu nem fecho logger nenhum, porque voce pede o logger por um factory, que repassa para o LogManager, e esta escrito assim na documentacao:

[quote]
The application should retain its own reference to the Logger object to avoid it being garbage collected. The LogManager may only retain a weak reference.[/quote]

mas DENTRO do codigo fonte, olha soh:

	...
	// We're adding a new logger.
	// Note that we are creating a strong reference here that will
	// keep the Logger in existence indefinitely.
	loggers.put(name, logger);

FALA SERIO. guarda strong reference. se fosse soft ao menos!!! Eles escrevem uma coisa e fazem outra. ABSURDO.

Manda isso pro BugParade… se é que já não está lá :slight_smile:

poxa!! 10 horas de sessão é de matar qualquer aplicação… haja memória mesmo… :smiley:

Pois é, normalmente vemos sessões variando de 15 minutos a 2 horas… :slight_smile:

A API tem uns buracos mesmo… que lixo!!!

Mas note que se vc pedir ao manager um logger com nome “PEAS”, ele vai retornar um logger novo na primeira chamada e o mesmo logger daí pra frente.

Talvez vc possa adaptar seu código pra escapar do leak usando nomes “unicos por contexto”… : )

[]s