我正在运行具有 3 个线程的多线程应用程序:
- 主线程 - 存储对象的向量列表
- AdderThread - 将对象添加到此向量列表
- RemoverThread - 使用 vectorList.clear() 方法删除对象(同步)
应用程序运行良好,但几个小时后它给出了 OutOfMemoryError。
我生成了堆转储并使用 eclipse MAT 进行分析,它显示 vectorList 类占用了所有内存。
方法是否clear
释放被单个对象占用的内存?
如何解决这个问题?
我正在运行具有 3 个线程的多线程应用程序:
应用程序运行良好,但几个小时后它给出了 OutOfMemoryError。
我生成了堆转储并使用 eclipse MAT 进行分析,它显示 vectorList 类占用了所有内存。
方法是否clear
释放被单个对象占用的内存?
如何解决这个问题?
如果您添加任务的速度比释放它们的速度快,您将收到 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 编写任何代码的需要。