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]