A classe principal de minha aplicação inicia instâncias de uma porrada de objetos (+ ou - umas 15 classes). Gostaria de saber se é correto eu atribuir null aos objetos (depois que não for usá-los mais) e chamar o GC, para melhorar a performance da aplicação. Sei que existem parâmetros de configuração da JVM que podem melhorar e muito a performance, mas no meu caso eu não gostaria de fazer isso, gostaria de manter o padrão de memória que a JVM usa.
Bruno, essa “porrada” de objetos, são só 15? Isso qualquer máquina hoje em dia faz com as mãos nas costas. Faz um for assim aí:
for(inti=0; i < 100; i++){System.out.println("Novo Objeto criado");
}
Se vc executar esse código, serão criados 100 objetos String. Mas a aplicação não perderá performance.
E sobre setar pra null, é aconselhável, mas isso não quer dizer que o GC irá instantaneamente coletar os objetos.
Outro detalhe, é que é impossível fazer com que o GC colete objetos não usados. Quem faz esse papel é a thread deamon da JVM.
Então, não adianta vc fazer o System.gc().
Abraço.
ViniGodoy
De que tipo de performance estamos falando? Velocidade? Uso de memória?
Bom, o primeiro passo é usar um profiler na sua aplicação. Meça o tempo de cada método e veja em que ponto da construção de seus objetos está o gargalo da sua aplicação. Geralmente o problema está concentrado em um só ponto e uma simples troca de algoritmo pode resolver.
Uma das coisas que você pode é usar lazy initialization em parte de seus objetos, e retirar espalhar o tempo dessa carga pela sua aplicação, normalmente em pontos imperceptíveis.
Mas… não adianta nada chutar o que fazer. Use o profiler primeiro, identifique o problema e daí sim, busque uma solução.
Tanto o Netbeans, quanto o Eclipse possuem ótimos profilers. Se você está compilando na mão, também pode usar o antigo (mas bem útil) EJP (Extensible Java Profiler).