我有一个带有约束流的课程调度问题,用于计算分数。在求解分配的堆时,不断增加,因此几个小时后,它甚至超过了8GB,我得到了一个java.lang.OutOfMemoryError: Java heap space。正如optaplanner文档中所述,堆的大小在求解阶段应该保持不变。我需要关于这类行为的问题以及如何调试它的建议。
由提供的复制器将复制这种行为。使用Collectors.toList()的这个约束似乎是我的项目中导致泄漏的唯一约束。
我做了一些分析:占用不断增加的内存的分配对象是类型的
org.drools.core.util.index.TupleList线程堆栈如下:
SwingWorker-pool-1-thread-3
at org.drools.core.reteoo.BaseLeftTuple.get(I)Lorg/drools/core/common/InternalFactHandle; (BaseLeftTuple.java:406)
at org.drools.modelcompiler.constraints.BindingEvaluator.getArgument(Lorg/drools/core/common/InternalFactHandle;Lorg/drools/core/common/InternalWorkingMemory;Lorg/drools/core/rule/Declaration;Lorg/drools/core/spi/Tuple;)Ljava/lang/Object; (BindingEvaluator.java:59)
at org.drools.modelcompiler.constraints.ConstraintEvaluator$InnerEvaluator.getArgument(Lorg/drools/core/common/InternalFactHandle;Lorg/drools/core/common/InternalWorkingMemory;Lorg/drools/core/rule/Declaration;Lorg/drools/core/spi/Tuple;)Ljava/lang/Object; (ConstraintEvaluator.java:234)
at org.drools.modelcompiler.constraints.ConstraintEvaluator$InnerEvaluator$_2.evaluate(Lorg/drools/core/common/InternalFactHandle;Lorg/drools/core/spi/Tuple;Lorg/drools/core/common/InternalWorkingMemory;)Z (ConstraintEvaluator.java:283)
at org.drools.modelcompiler.constraints.ConstraintEvaluator.evaluate(Lorg/drools/core/common/InternalFactHandle;Lorg/drools/core/spi/Tuple;Lorg/drools/core/common/InternalWorkingMemory;)Z (ConstraintEvaluator.java:117)
at org.drools.modelcompiler.constraints.LambdaConstraint.isAllowedCachedRight(Lorg/drools/core/spi/Tuple;Lorg/drools/core/rule/ContextEntry;)Z (LambdaConstraint.java:160)
at org.drools.core.common.TripleBetaConstraints.isAllowedCachedRight([Lorg/drools/core/rule/ContextEntry;Lorg/drools/core/spi/Tuple;)Z (TripleBetaConstraints.java:123)
at org.drools.core.phreak.PhreakJoinNode.doRightUpdatesProcessChildren(Lorg/drools/core/reteoo/LeftTuple;Lorg/drools/core/reteoo/LeftTuple;Lorg/drools/core/reteoo/RightTuple;Lorg/drools/core/common/TupleSets;[Lorg/drools/core/rule/ContextEntry;Lorg/drools/core/common/BetaConstraints;Lorg/drools/core/reteoo/LeftTupleSink;Lorg/drools/core/util/FastIterator;Lorg/drools/core/common/TupleSets;)Lorg/drools/core/reteoo/LeftTuple; (PhreakJoinNode.java:347)
at org.drools.core.phreak.PhreakJoinNode.doRightUpdates(Lorg/drools/core/reteoo/JoinNode;Lorg/drools/core/reteoo/LeftTupleSink;Lorg/drools/core/reteoo/BetaMemory;Lorg/drools/core/common/InternalWorkingMemory;Lorg/drools/core/common/TupleSets;Lorg/drools/core/common/TupleSets;Lorg/drools/core/common/TupleSets;)V (PhreakJoinNode.java:320)
at org.drools.core.phreak.PhreakJoinNode.doNode(Lorg/drools/core/reteoo/JoinNode;Lorg/drools/core/reteoo/LeftTupleSink;Lorg/drools/core/reteoo/BetaMemory;Lorg/drools/core/common/InternalWorkingMemory;Lorg/drools/core/common/TupleSets;Lorg/drools/core/common/TupleSets;Lorg/drools/core/common/TupleSets;)V (PhreakJoinNode.java:59)
at org.drools.core.phreak.RuleNetworkEvaluator.switchOnDoBetaNode(Lorg/drools/core/common/NetworkNode;Lorg/drools/core/common/TupleSets;Lorg/drools/core/common/InternalWorkingMemory;Lorg/drools/core/common/TupleSets;Lorg/drools/core/common/TupleSets;Lorg/drools/core/reteoo/LeftTupleSinkNode;Lorg/drools/core/reteoo/BetaMemory;Lorg/drools/core/reteoo/AccumulateNode$AccumulateMemory;)V (RuleNetworkEvaluator.java:569)
at org.drools.core.phreak.RuleNetworkEvaluator.evalBetaNode(Lorg/drools/core/reteoo/PathMemory;Lorg/drools/core/common/NetworkNode;Lorg/drools/core/common/Memory;[Lorg/drools/core/reteoo/SegmentMemory;ILorg/drools/core/common/TupleSets;Lorg/drools/core/common/InternalAgenda;Lorg/drools/core/util/LinkedList;ZLorg/drools/core/phreak/RuleExecutor;Lorg/drools/core/common/TupleSets;Lorg/drools/core/common/TupleSets;Lorg/drools/core/reteoo/LeftTupleSinkNode;)Z (RuleNetworkEvaluator.java:555)
at org.drools.core.phreak.RuleNetworkEvaluator.evalNode(Lorg/drools/core/reteoo/PathMemory;Lorg/drools/core/common/NetworkNode;JLorg/drools/core/common/Memory;[Lorg/drools/core/reteoo/SegmentMemory;ILorg/drools/core/common/InternalAgenda;Lorg/drools/core/util/LinkedList;ZLorg/drools/core/phreak/RuleExecutor;Lorg/drools/core/common/TupleSets;Lorg/drools/core/reteoo/SegmentMemory;Lorg/drools/core/common/TupleSets;Lorg/drools/core/reteoo/LeftTupleSinkNode;)Lorg/drools/core/common/TupleSets; (RuleNetworkEvaluator.java:382)
at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(Lorg/drools/core/reteoo/PathMemory;Lorg/drools/core/common/NetworkNode;JLorg/drools/core/common/Memory;[Lorg/drools/core/reteoo/SegmentMemory;ILorg/drools/core/common/TupleSets;Lorg/drools/core/common/InternalAgenda;Lorg/drools/core/util/LinkedList;ZLorg/drools/core/phreak/RuleExecutor;)V (RuleNetworkEvaluator.java:342)
at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(Lorg/drools/core/reteoo/PathMemory;Lorg/drools/core/common/NetworkNode;JLorg/drools/core/common/Memory;[Lorg/drools/core/reteoo/SegmentMemory;ILorg/drools/core/common/TupleSets;Lorg/drools/core/common/InternalAgenda;Lorg/drools/core/util/LinkedList;ZLorg/drools/core/phreak/RuleExecutor;)V (RuleNetworkEvaluator.java:178)
at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(Lorg/drools/core/reteoo/PathMemory;Lorg/drools/core/phreak/RuleExecutor;Lorg/drools/core/common/InternalAgenda;)V (RuleNetworkEvaluator.java:136)
at org.drools.core.phreak.RuleExecutor.reEvaluateNetwork(Lorg/drools/core/common/InternalAgenda;)V (RuleExecutor.java:215)
at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(Lorg/drools/core/common/InternalAgenda;Lorg/kie/api/runtime/rule/AgendaFilter;II)I (RuleExecutor.java:89)
at org.drools.core.concurrent.AbstractRuleEvaluator.internalEvaluateAndFire(Lorg/kie/api/runtime/rule/AgendaFilter;IILorg/drools/core/phreak/RuleAgendaItem;)I (AbstractRuleEvaluator.java:33)
at org.drools.core.concurrent.SequentialRuleEvaluator.evaluateAndFire(Lorg/kie/api/runtime/rule/AgendaFilter;IILorg/drools/core/common/InternalAgendaGroup;)I (SequentialRuleEvaluator.java:43)
at org.drools.core.common.DefaultAgenda.fireLoop(Lorg/kie/api/runtime/rule/AgendaFilter;ILorg/drools/core/common/DefaultAgenda$RestHandler;Z)I (DefaultAgenda.java:1115)
at org.drools.core.common.DefaultAgenda.internalFireAllRules(Lorg/kie/api/runtime/rule/AgendaFilter;IZ)I (DefaultAgenda.java:1062)
at org.drools.core.common.DefaultAgenda.fireAllRules(Lorg/kie/api/runtime/rule/AgendaFilter;I)I (DefaultAgenda.java:1054)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.internalFireAllRules(Lorg/kie/api/runtime/rule/AgendaFilter;I)I (StatefulKnowledgeSessionImpl.java:1347)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(Lorg/kie/api/runtime/rule/AgendaFilter;I)I (StatefulKnowledgeSessionImpl.java:1338)
at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules()I (StatefulKnowledgeSessionImpl.java:1322)
at org.optaplanner.core.impl.score.stream.drools.DroolsConstraintSession.calculateScore(I)Lorg/optaplanner/core/api/score/Score; (DroolsConstraintSession.java:72)
at org.optaplanner.core.impl.score.director.stream.ConstraintStreamScoreDirector.calculateScore()Lorg/optaplanner/core/api/score/Score; (ConstraintStreamScoreDirector.java:74)
at org.optaplanner.core.impl.score.director.AbstractScoreDirector.doAndProcessMove(Lorg/optaplanner/core/impl/heuristic/move/Move;ZLjava/util/function/Consumer;)V (AbstractScoreDirector.java:225)
at org.optaplanner.core.impl.localsearch.decider.LocalSearchDecider.doMove(Lorg/optaplanner/core/impl/localsearch/scope/LocalSearchMoveScope;)V (LocalSearchDecider.java:133)
at org.optaplanner.core.impl.localsearch.decider.LocalSearchDecider.decideNextStep(Lorg/optaplanner/core/impl/localsearch/scope/LocalSearchStepScope;)V (LocalSearchDecider.java:117)
at org.optaplanner.core.impl.localsearch.DefaultLocalSearchPhase.solve(Lorg/optaplanner/core/impl/solver/scope/SolverScope;)V (DefaultLocalSearchPhase.java:71)
at org.optaplanner.core.impl.solver.AbstractSolver.runPhases(Lorg/optaplanner/core/impl/solver/scope/SolverScope;)V (AbstractSolver.java:99)
at org.optaplanner.core.impl.solver.DefaultSolver.solve(Ljava/lang/Object;)Ljava/lang/Object; (DefaultSolver.java:163)
at myCalculateClass.calculate
at mySwingWorker$1.doInBackground()
at javax.swing.SwingWorker$1.call()Ljava/lang/Object; (SwingWorker.java:304)
at java.util.concurrent.FutureTask.run()V (FutureTask.java:264)
at javax.swing.SwingWorker.run()V (SwingWorker.java:343)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V (ThreadPoolExecutor.java:1128)
at java.util.concurrent.ThreadPoolExecutor$Worker.run()V (ThreadPoolExecutor.java:628)
at java.lang.Thread.run()V (Thread.java:829)发布于 2021-07-12 07:08:56
(只是重复/扩展@hornisgrinde的评论,这样这个问题就有了一个清晰的答案。)
运行mvn dependency:tree (或等效的gradle命令),确保所有optaplanner-*和drools-*版本同步。
在这种情况下,类路径包含optaplanner-test 8.3.0和optaplanner-core 8.7.0,它们被optaplanner-test传递依赖于optaplanner-core所遮蔽。为了完全避免这个问题,使用optaplanner。
<project>
...
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.optaplanner</groupId>
<artifactId>optaplanner-bom</artifactId>
<type>pom</type>
<version>8.8.0.Final</version>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.optaplanner</groupId>
<artifactId>optaplanner-core</artifactId>
</dependency>
<dependency>
<groupId>org.optaplanner</groupId>
<artifactId>optaplanner-test</artifactId>
<scope>test</scope>
</dependency>
...
</dependencies>
</project>https://stackoverflow.com/questions/68129494
复制相似问题