我们使用Spring中的OptaPlanner(8.2.0)库来解决背包问题,使用构造启发式算法。在运行应用程序时,我们观察到,即使在解决了问题之后,SolverManager
创建的线程也不会被释放。正因为如此,应用程序的性能在一段时间后开始下降。此外,求解器管理器开始缓慢响应增加的线程计数。
我们也尝试了最新版本(8.17.0),但问题仍然存在。
终止条件:
<termination>
<millisecondsSpentLimit>200</millisecondsSpentLimit>
</termination>
optaplanner:
solver:
termination:
best-score-limit: 0hard/*soft
代码:
@Component
@Slf4j
public class SolutionManager {
private final SolverManager<Solution, String> solutionManager;
public SolutionManager(SolverManager<Solution, String> solutionManager) {
this.solutionManager = solutionManager;
}
public Solution getSolutionResponse(String solutionId, Solution unsolvedProblem)
throws InterruptedException, ExecutionException {
SolverJob<Solution, String> solve = solutionManager.solve(solutionId, unsolvedProblem);
Solution finalBestSolution = solve.getFinalBestSolution();
return finalBestSolution;
}
}
线程度量:
发布于 2022-02-25 10:46:25
我无法重现这个问题;在并行地解决了几个数据集所表示的负载之后,线程数量下降到与加载开始前相同的值。
您共享的图表也不清楚地表明存在线程泄漏;如果您查看~12:40 PM并将其与~2:00 PM进行比较,那么线程的数量实际上确实减少了。
还让我补充一下,getFinalBestSolution()
方法实际上阻止调用线程,直到求解器完成为止。如果使用solve(ProblemId_ problemId, Solution_ problem, Consumer finalBestSolutionConsumer
),则此方法将立即返回,并且在求解器完成时将调用您提供的Consumer
。
发布于 2022-03-09 07:54:55
看起来您可能没有使用OptaPlanner Spring。
如果是这样的话,升级到最新版本的OptaPlanner并向optaplanner-spring-boot-starter
添加一个依赖项。有关如何使用该库的示例,请参阅docs spring和存储库(在目录技术中)。
https://stackoverflow.com/questions/71263355
复制相似问题