我有生产者消费者申请。基本上是HP Vertica的UDTF,我从数据库中获取数据。然后我将它传递给Dispatcher以获得下一个功能。但是在传递数据时,需要复制它以使最终集合的列表在队列中传递。
伪代码段:
do {
//Model T from row
list.add(t)
if(size of batch matched){
// copy list into new final arraylist
final batch = new Arralylist(list);
dispatcher.submit( new BatchProcessor() {
public list getBatch() { return batch; }})
}
} while(till have data, few million records)
在上面的代码段中,竞争条件被创建,我得到例外:
Java内存不足:达到垃圾收集器开销限制。
尝试解决方案:
你能为我建议解决方案吗?
谢谢!
修改
有关env的更多信息:
我没有JVM的任何自定义设置。但我想我需要做一些事情。我不知道应该尝试哪一个。我觉得的主要问题是在发送到内部类时复制数据。我们可以避免吗?如果是的话,我们怎么办?
答案 0 :(得分:0)
上述案例中遇到的问题通过 限制阻止队列的大小 来解决。
提交到队列的数据肯定是高大的,但在这种情况下,使用的队列大小应该小于或等于线程数。这样我们就可以限制空闲java对象的大小。此类队列中的对象处于管道阶段,不参与活动处理。
我认为,解决方案背后的主要原因是阻塞队列的put方法在内部处理wait-notify协议;这会停止创建新对象。