2013-06-26 2 views
0

Я занимаюсь проблемой оптимизации, в которой я хочу выполнить каждый поток Solver (по одному за раз) со случайными параметрами в течение фиксированного периода времени. Если какой-либо из потоков успешно найдет решение, он вернется и программа выйдет.ExecutorService Execptions и утечка памяти?

У меня есть код ниже, где я использовал ExecutorService и Future, чтобы помочь мне в этом. Однако по некоторым причинам использование памяти в программе увеличивается с течением времени, и программа заканчивается с ошибкой OutOfMemory до того, как она будет очень далеко. Мой код Solver, безусловно, не является проблемой, поскольку он не имеет статических переменных и использует постоянный объем памяти. Мне интересно, не потому ли, что я не очищаю потоки или неправильно обрабатываю исключения, но я не могу найти какую-либо вопиющую проблему из кода.

public class RandomizedSolver { 
    public static void main(String[] args) { 
     try { 
      for (int i = 0; i < 300; i++) { 
       ExecutorService executor = Executors.newSingleThreadExecutor(); 
       try { 
        System.out.println("Starting new thread"); 
        Future<Void> future = executor.submit(new Solver(args)); 
        future.get(1, TimeUnit.SECONDS); 
        executor.shutdownNow(); 
        break; 
       } catch (TimeoutException e) { 
        System.out.println("Thread timeout."); 
        executor.shutdownNow(); 
        continue; 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Что такое класс 'Solver'? – Andremoniy

ответ

2

Пункт использования ExecutorServices заключается в повторном использовании их потоков, чтобы не воссоздавать их. Вы должны пересмотреть свой дизайн и иметь только один ExecutorService с соответствующим количеством нижележащих потоков и передать все ваши задачи этому уникальному ExecutorService.

Также обратите внимание, что если ваши задачи занимают более 1 секунды, и если они прерываются без прерывания, вы можете одновременно запускать до 300 задач ExecutorServices и 300 задач Solver. В зависимости от того, сколько памяти занимает Solver, это может привести к ошибке OOME.