Problema com Sockets (resolvido!)

Estou utilizando o VisualVM para monitorar o número de objetos instanciados e a memória por eles ocupada enquanto executo o Servidor e um loop de teste que simula o cliente enviando pacotes em seqüência.
O “vilão” do consumo de memória são arrays de byte (byte[]), de acordo com o VisualVM.
Conforme o tempo passa, os byte[] vão somente aumentando o consumo de memória do servidor e não são excluídos pelo Garbage Collector.
Já tentei as seguintes soluções sem sucesso:

  • Não utilizar o método reset()
  • Utilizar o método reset()
  • Ao invés de utilizar os métodos writeObject() e readObject(), utilizei os métodos
    writeUnshared() e readUnshared()
  • Executar “Thread.sleep(1000)” antes de fechar os Streams e o Socket. Isso ajudou na diminuição
    dos “exceptions” devido ao envio de pacotes pelo loop de teste mas a memória ocupada pelo
    byte[] ainda continua aumentando no VisualVM.

Abaixo segue o código atual do servidor.

[code]public void run() {
try {
// Obtém pacote enviado pelo cliente.
input = new ObjectInputStream(socket.getInputStream());
pacote = (Pacote)input.readObject();
// Processa o pacote.
Pacote pacoteAux = processarPacote(pacote);
// Envia resposta ao cliente.
output = new ObjectOutputStream(socket.getOutputStream());
output.writeObject(pacoteAux);
pacoteAux = null;
output.flush();
output.reset();
} catch (ClassNotFoundException ex) {
ex.printStackTrace(System.out);
logger.error("[ComunicacaoThread]: “, ex);
} catch (IOException ex) {
ex.printStackTrace(System.out);
logger.error(”[ComunicacaoThread]: ", ex);
} finally {
desconectar();
}
}

private void desconectar() {
     try {
        Thread.sleep(1000); 
        
        if ( input != null ) {               
            input.close();       
        }
        
        if ( output != null ) {                    
            output.close();               
        }
        
        if ( socket != null && socket.isConnected() ) {
            socket.close();           
        }
        
        anular();                
    } catch (IOException ex) {
        anular();
        ex.printStackTrace(System.out);
        logger.error("[ComunicacaoThread]: ", ex);
    } catch (InterruptedException ex) {
        anular();
        ex.printStackTrace(System.out);
        logger.error("[ComunicacaoThread]: ", ex);
    }
}

private void anular() {
    input = null;
    output = null;
    socket = null;
    pacote = null;
    marcacaoDAO = null;
    funcionarioDAO = null;
    mensagemDAO = null;
    funhorDAO = null;
    funhorExcecaoDAO = null;  
    funcionario = null;
    funhor = null;
    funhorExcecao = null;
    System.gc();      
}[/code]

Segue print do VisualVM mostrando o consumo de memória por arrays de bytes (byte[]).

Após dias de análise, muitas tentativas e testes, finalmente achei o vilão da história toda: Log4J.
Removi a utilização do Log4J da minha aplicação e foi-se embora o Memory Leak dos byte arrays (byte []).
Talvez eu não estivesse utilizando-o direito, não sei, enfim, a versão que eu estava utilizando é log4j-1.2.15.jar.

Muito obrigado aos colegas thingol e fantomas pela ajuda.

Abraços,
Fabio

:smiley: :smiley: :smiley: :smiley: