内存泄漏向量列表中的Java OutOfMemoryError

时间:2012-08-10 10:07:50

标签: java multithreading memory vector memory-leaks

我正在运行一个包含3个线程的多线程应用程序:

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

应用程序运行正常但几小时后就会出现OutOfMemoryError。

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

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

如何解决这个问题?

1 个答案:

答案 0 :(得分:9)

如果你以比释放它们更快的速度添加任务,你将得到一个OutOfMemoryError,因为你的Vector会增长到你的记忆极限。

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

e.g。

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编写任何代码了。