垃圾收集时,多个线程之间共享java对象?

时间:2015-08-24 00:24:20

标签: java multithreading garbage-collection

处理存在大量内存问题的程序。 该程序由两个线程组成。线程1从队列中获取数据,处理它们,创建各种对象并将它们传递给线程2以便在db中进行处理和存储。 Used Heap大小一直攀升,直到OutOfMemory错误发生。

我通过仅使用一个线程解决了内存问题,因为根据我的理解,对象最终保持活动状态,因此没有GC-ed,因为对它们的引用仍然存在于线程2和数据库存储过程中。

我还有一个问题:在线程1中创建的对象什么时候会被GC编辑?线程1何时退出?什么时候使用它们进行进一步处理的线程2会退出?

2 个答案:

答案 0 :(得分:0)

  

什么时候在线程1中创建的对象应该被GC编辑?

每当GC喜欢时,都要收藏它们。也许永远不会。

  

线程1何时退出?什么时候使用它们进行进一步处理的线程2会退出?

以上都不是。它们在无法访问时变得可收集,即当对它们的所有引用都超出范围,或者包含对象变得无法访问时。线程在执行时始终可以访问。

答案 1 :(得分:0)

这里没有足够的信息,但我猜测你是使用队列从线程1“传递”对象到线程2并且你的内存不足,因为线程1生成的“对象”比线程2更快能够使用它们(将它们写入数据库)。

如果确实如此,您可以自己限制队列的大小,或使用具有预定义容量的LinkedBlockingQueue。您也可以通过创建更多的线程2实例来加快速度(前提是它们的工作可以并行执行),但如果瓶颈是数据库,那么您可以做的很少。