Dúvida System.gc()

Fala galera,

Colocar um System.gc() no done() do SwingWorker causaria algum problema ao meu programa?

public class Teste extends SwingWorker<Object, Object> {

        @Override
        protected Object doInBackground() throws Exception {

            //Código

            return null;
        }

        @Override
        protected void done() {
            super.done(); //To change body of generated methods, choose Tools | Templates.
            System.gc();
        }   
    }

Porquê você acha que causaria algum tipo problema?

Esse método faz somente a chamada do GC!

Primeiro você tem que se perguntar porque precisa chamar o GC diretamente. Pois na grande maioria das vezes não precisa, é melhor deixar a JVM gerenciar isso para você (a ideia de ter um GC é justamente você não precisar se preocupar com ele).

Além disso, a própria documentação diz o seguinte (ênfase minha):

Calling the gc method suggests that the Java Virtual Machine expend effort toward recycling unused objects

There is no guarantee that this effort will recycle any particular number of unused objects, reclaim any particular amount of space, or complete at any particular time

Ou seja, chamar System.gc() não garante que o GC será executado. É no máximo uma sugestão, mas no fim é a JVM que decide quando vai de fato rodá-lo.

De qualquer forma, se você está com problemas de vazamento ou uso excessivo de memória, é melhor verificar as causas e tratá-las, em vez de tentar forçar a execução do GC.


Para mais informações, leia também aqui e aqui.