Spring Boot项目中Drools规则引擎中的GC内存不足

时间:2018-04-27 07:01:00

标签: java spring-boot out-of-memory drools rule-engine

我需要根据两个字段比较两个List的数据,如果数据匹配,则将其添加到另一个列表中。

我写的规则工作正常但是当我试图测试它以获得更多记录(比如10,000条记录)时,它正在抛出GC Out of Memory error

为此,我在工作记忆中添加了两个列表(事实)。添加它的代码如下:

   // insert List 1
    list1.stream().forEach(p -> kieSession.insert(p));
    // insert List 2
    list2.stream().forEach(p ->kieSession.insert(p));

这两个列表都有相同的字段。现在,我需要检查list1的field1和field2的数据是否与list2的数据匹配。我写的规则的代码如下:

       rule "To check list1 and list2" 
        salience 5
        no-loop true
           when
                list1: List1($field1:field1,$field2:field2)
                list2: List2($field1List2:field1,$field2List2:field2)
                eval($field1List2==$field1&&$field2List2==$field2)
            then
                globalList.add(list2);
                retract(list1);
                retract(list2);
        end

我无法找出GC out of memory的原因。

我是否对规则做错了或者我需要增加JVM内存?

目前,JVM内存为-Xms2048m

1 个答案:

答案 0 :(得分:1)

Drools基于Rete算法,因此需要O(m * n)时间和内存来执行CROSS-JOIN工作,这会导致性能不佳和OOM容易。尽量不要在规则中编写连接条件,在工作内存外部进行连接工作。