Ошибка потоковой обработки параллелизма Java

#java #multithreading #concurrency

#java #многопоточность #параллелизм

Вопрос:

У меня есть список из 100 строк. Для каждой строки мне нужно выполнить 3 задачи. Итак, я представил параллельные потоки

 Class A implements Runnable
{

  String str;
  A(String s)
  {
    str = s;
  }

  public static void main(String[] args)
   {
     Runnable runnable = null;

      //For Each of my strings
      for(String s:MyList)
      {
          runnable = new A(s);
          new Thread(runnable).start();
      }
  }

   @Override
   public void run() {
       task1();
       task2();
       task3();
   }
 }
 

Это приводит к исключению.

Исключение в потоке «main» java.lang.Ошибка OutOfMemoryError: превышен лимит накладных расходов GC Исключение в потоке «Thread-0» java.lang.Ошибка OutOfMemoryError: пространство кучи Java

Как мне преодолеть это и ограничить размер потока?

Я пытался использовать это.

 ExecutorService pool = Executors.newFixedThreadPool(10);
pool.execute(runnable);
 

Это не работает.

Комментарии:

1. Вы создаете новый пул потоков для каждой итерации?

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

Ответ №1:

«java.lang.OutOfMemoryError: Java heap space» означает в значительной степени именно то, что он говорит — куче (место, из которого вы выделяете новые объекты Java) не хватает места. Не уверен, что вы делаете в этих задачах, но, должно быть, для этого используется много памяти.

Вы можете либо выяснить, что занимает так много памяти, и уменьшить ее. Или вы можете, как вы упомянули, уменьшить количество одновременных операций, что, по-видимому, потребляло бы меньше памяти. Или вы можете использовать что-то вроде:

 java -Xmx1024M A
 

Чтобы вручную указать объем памяти, доступный для JVM. Но обратите внимание, что просто увеличивать лимит памяти, не понимая, почему он использует так много памяти, не очень хорошая идея. Я бы предложил сначала поискать ошибку в этих вызовах taskN().

Комментарии:

1. Спасибо! Я проверю это. Да! Каждая задача занимает много времени, поскольку они обращаются к API примерно 300 раз для каждого потока. Именно по этой причине я выбрал многопоточность, поскольку один поток занимал раздражающе огромное количество времени