1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Como Remover Thread Executada da Memoria?

Olá. Tenho um método que tem um loop infinito que tem como objetivo a cada 10 segundos verificar se existem novos registros em uma tabela na base de dados e enviar para um Pool de Threads com ExecutorService. Até ai está ok, porém queria saber como posso remover essas threads para liberar memoria que já tenham sido executadas.

Tentei utilizar a remoção dos objetos de um List, porem parece não resolver meu problema. Pois verifico no JConsole que o consumo de memoria só aumenta até atingir 1.2GB que é o máximo de memoria dedicado a essa execução.

Não posso utilizar o executor.shutdown(), pois como o processo deve permanecer ativo para receber novas requisições, se faz necessário manter o executor disponivel para receber essas novas requisições.

Andei pesquisando muito e não encontrei uma solução viavel para esse problema ainda.

public void executar() {

        rollBackInterruptedParametros();

        while (true) {

            try {
                List<DpParametro> analisesPendentes = dao.getProximasAnalisesPendentes();
                if (analisesPendentes != null) {

                    for (DpParametro analise : analisesPendentes) {
                        DProcessoExecutor dprocessoParametro = new DProcessoExecutor(analise);
                        taskList.add(executor.submit(dprocessoParametro));
                    }
                }

                Iterator<Future<DProcessoExecutor>> it = taskList.iterator();
                while (it.hasNext()) {
                    Future<DProcessoExecutor> execucao = it.next();
                    try {
                        DProcessoExecutor exec = execucao.get();
                        if (execucao.isDone()) {
                            exec = null;
                            it.remove();
                        }
                    } catch (ExecutionException ex) {
                        ex.printStackTrace();
                    }
                }

                Thread.sleep(10000);

            } catch (InterruptedException ex) {
                Logger.getLogger(DProcessoExecutorService.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

    }
  • Voce ja tentou Forçar o Garbage Collector a funcionar no final da função ?

    Caio Filus Felisbino   24 de jun de 2015
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags java threads ou faça a sua própria pergunta.