#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 раз для каждого потока. Именно по этой причине я выбрал многопоточность, поскольку один поток занимал раздражающе огромное количество времени