生产者消费者:Java内存不足:达到垃圾收集器开销限制

时间:2014-06-10 02:42:08

标签: java collections garbage-collection out-of-memory producer-consumer

我有生产者消费者申请。基本上是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内存不足:达到垃圾收集器开销限制。

尝试解决方案:

  1. 我试图增加JVM大小;随着规模的增加,我可以增加批量的大小'。
  2. 如果数据量较小;即循环计数较少,则应用程序也可以成功执行;但随着大小增加,记忆贪婪增加并且出现竞争状况
  3. 你能为我建议解决方案吗?

    谢谢!

    修改

    有关env的更多信息:

    1. 多节点和多处理器
    2. Java 7
    3. 我没有JVM的任何自定义设置。但我想我需要做一些事情。我不知道应该尝试哪一个。我觉得的主要问题是在发送到内部类时复制数据。我们可以避免吗?如果是的话,我们怎么办?

1 个答案:

答案 0 :(得分:0)

上述案例中遇到的问题通过 限制阻止队列的大小 来解决。

提交到队列的数据肯定是高大的,但在这种情况下,使用的队列大小应该小于或等于线程数。这样我们就可以限制空闲java对象的大小。此类队列中的对象处于管道阶段,不参与活动处理。

我认为,解决方案背后的主要原因是阻塞队列的put方法在内部处理wait-notify协议;这会停止创建新对象。