我有一个包含 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);
这不起作用。
最佳答案
“java.lang.OutOfMemoryError: Java heap space”的意思与它所说的差不多——堆(分配新Java对象的地方)空间不足。不确定您在这些任务中做什么,但它一定使用了大量内存。
您可以找出是什么占用了这么多内存并减少它。或者您可以 - 正如您所提到的 - 减少并发操作的数量,这可能会使用更少的内存。或者你可以使用类似的东西:
java -Xmx1024M A
手动指定 JVM 可用的内存量。但请注意,仅增加内存限制而不了解为什么使用如此多的内存并不是一个好主意。我建议首先在这些 taskN() 调用中查找错误。
关于Java并发线程错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24346405/