【问题标题】:Java Concurrency Threading ErrorJava并发线程错误
【发布时间】:2014-06-21 22:26:52
【问题描述】:

我有一个包含 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();
   }
 }

这会遇到异常。

线程“主”java.lang.OutOfMemoryError 中的异常:超出 GC 开销限制 线程“Thread-0”java.lang.OutOfMemoryError 中的异常:Java 堆空间

如何克服这个问题并限制线程大小?

我试过用这个。

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

它不起作用。

【问题讨论】:

  • 你是否为每次迭代创建一个新的线程池?
  • 您应该返回尝试使您的ExecutorService 版本正常工作。因为这是运行 100 个异步任务的更合理的方式。

标签: java multithreading concurrency


【解决方案1】:

“java.lang.OutOfMemoryError: Java heap space”的意思和它说的差不多——堆(你分配新Java对象的地方)空间不足。不确定您在这些任务中在做什么,但它一定会占用大量内存。

您可以找出是什么占用了这么多内存并减少它。或者你可以 - 正如你提到的 - 减少并发操作的数量,这可能会使用更少的内存。或者你可以使用类似的东西:

java -Xmx1024M A

手动指定可供 JVM 使用的内存量。但请注意,仅仅增加内存限制而不了解它为什么使用这么多内存并不是一个好主意。我建议先在这些 taskN() 调用中查找错误。

【讨论】:

  • 谢谢!我会看看。是的!每个任务确实需要很多时间,因为它们为每个线程访问一个 API 大约 300 次。这就是我选择多线程的原因,因为单线程花费了大量的时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多