Java并发线程错误

标签 java multithreading concurrency

我有一个包含 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/

相关文章:

java - 在mapreduce程序中使用静态变量

C++ 移动类,里面有线程

java - 使用系统首选应用程序显示 zip 内的文件而不使用 java 解压缩?

java - 我的 GUI 中使用 ActionListener 时出现错误

c++ - 计算斐波那契数的一般 tbb 问题

java - 找不到符号 : Thread. sleep (1000);

java - ConcurrentHashMap 的迭代器给出奇怪的结果

kotlin - 在Kotlin中删除Iterator或List之前的任意内容

java - 斯卡拉 future : How to guarantee a non-null result?

java - Spring Quartz 使用父类构造函数设置基于构造函数的注入(inject)