Java堆空间OutOfMemoryError,这是由于LS阶段期间内存使用量的持续增加

时间:2019-05-23 22:08:54

标签: optaplanner

我有一个任务分配问题需要优化。由于约会窗口和休息时间,我已决定在允许的间隙内使用“ Chained Through Time Pattern”。我正在使用LocalDateTime和Duration类来获取与日期/时间相关的值。

我为应用程序提供的最大内存为2000兆字节,并且我正在500个班次中优化4000个任务(50个工作人员x 10天)...这意味着4000个规划实体和500个锚点。该应用程序设置为最多运行8小时。

CH相位快速而轻松地缩放,然后LS相位开始并且平稳进行。但是,随着时间的流逝,直到抛出OOME为止,内存使用率越来越高。

似乎,如果我禁用了所有流口水规则(通过在其when条件前加上false &&,从而使这些规则永不被评估),这会使程序运行得更快,内存使用率提升速度也更快。在3分钟内(而不是数小时内)抛出OOME。

我的配置如下(省略了提前终止条件):

<solver>
    <environmentMode>NON_REPRODUCIBLE</environmentMode>
    <moveThreadCount>AUTO</moveThreadCount>

    <solutionClass>...</solutionClass>
    <entityClass>...</entityClass>
    ...

    <scoreDirectorFactory>
        <scoreDrl>...</scoreDrl>
        <initializingScoreTrend>ONLY_DOWN</initializingScoreTrend>
    </scoreDirectorFactory>

    <constructionHeuristic>
        <constructionHeuristicType>ALLOCATE_ENTITY_FROM_QUEUE</constructionHeuristicType>
        <entitySorterManner>DECREASING_DIFFICULTY</entitySorterManner>
        <valueSorterManner>DECREASING_STRENGTH</valueSorterManner>
        <changeMoveSelector/>
    </constructionHeuristic>

    <localSearch>
        <unionMoveSelector>
            <changeMoveSelector/>
            <swapMoveSelector/>
            <tailChainSwapMoveSelector/>
            <subChainChangeMoveSelector/>
            <subChainSwapMoveSelector/>
        </unionMoveSelector>
        <acceptor>
            <lateAcceptanceSize>200</lateAcceptanceSize>
        </acceptor>
        <forager>
            <acceptedCountLimit>1</acceptedCountLimit>
        </forager>
    </localSearch>
</solver>

下面是一个优化运行的示例,该运行可以在4小时内获得OOME:
run @ 3 hours in (almost OOME)
run @ 4 hours in (OOME)

0 个答案:

没有答案