正在处理一个存在巨大内存问题的程序。 该程序由两个线程组成。线程 1 从队列中获取数据,处理它们,创建各种对象并将它们传递给线程 2 进行处理并存储在数据库中。 使用的堆大小不断攀升,直到发生 OutOfMemory 错误。
我仅使用一个线程解决了内存问题,因为据我所知,对象最终保持 Activity 状态,因此不会被 GC 处理,因为对它们的引用在整个线程 2 和数据库存储过程中仍然存在。
我还有一个问题:线程 1 中创建的对象什么时候会被 GC 回收?线程1什么时候退出?当线程 2(将使用它们进行进一步处理)退出时?
最佳答案
when would the objects created in thread 1 be expected to be GC-ed?
只要 GC 愿意,只要它们可以 Collection 即可。也许永远不会。
when thread 1 exits ? when thread 2, which would use them for further processing, would exit ?
以上都不是。当它们无法访问时,即当对它们的所有引用都超出了范围,或者包含的对象变得无法访问时,它们就变得可收集。线程在执行时始终可达。
关于java对象在多个线程之间共享,何时垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32172911/