2

我正在运行具有 3 个线程的多线程应用程序:

  • 主线程 - 存储对象的向量列表
  • AdderThread - 将对象添加到此向量列表
  • RemoverThread - 使用 vectorList.clear() 方法删除对象(同步)

应用程序运行良好,但几个小时后它给出了 OutOfMemoryError。

我生成了堆转储并使用 eclipse MAT 进行分析,它显示 vectorList 类占用了所有内存。

方法是否clear释放被单个对象占用的内存?

如何解决这个问题?

4

1 回答 1

9

如果您添加任务的速度比释放它们的速度快,您将收到 OutOfMemoryError,因为您的 Vector 将增长到您的内存限制。

我建议不要使用 Vector 作为工作队列,而是使用并发库中的 BlockingQueue。

例如

BlockingQueue<Work> queue = new ArrayBlockingQueue<>(MAX_TASKS_WAITING);

AdderThread calls queue.put(work); // blocks if the queue is full

RemoverThread call queue.take(); // blocks if there is nothing to do.

事实上,使用 ExecutorService 会简单得多,因为它结合了工作队列和线程池。您将任务提交给执行者并由它处理。这避免了为 RemoverThread 编写任何代码的需要。

于 2012-08-10T10:20:53.837 回答