使用OjAlgo求解线性规划时UNEXPLORED状态问题求助
针对你在资源受限网关中遇到的UNEXPLORED状态重复出现问题,除了已使用的Intermediate.dispose(),还可尝试以下操作彻底清理资源:
彻底切断模型引用链:求解完成后,除调用
Intermediate.dispose(),需将所有与模型相关的变量、约束、目标函数实例显式置为null,同时清空存储这些实例的集合(如variables().clear()、constraints().clear())。避免保留任何间接引用,确保JVM垃圾回收能完整回收模型资源。在资源紧张场景下,可主动触发垃圾回收(System.gc()+Runtime.getRuntime().runFinalization()),但需注意这仅为辅助手段,不能替代引用清理。显式管理求解器实例生命周期:不要依赖OjAlgo的隐式求解器复用,每次求解时全新创建求解器实例,求解完成后直接丢弃该实例(置为
null)。若使用特定求解器实现(如ApacheCommonsLP、OOOPSolver),需查看其API是否提供直接的资源释放方法(如close()或destroy()),调用后再丢弃实例。隔离求解线程上下文:将每次求解过程放在独立的线程中执行,求解完成后让线程自然终止。线程结束时,其关联的ThreadLocal资源、栈帧引用会被自动清理,能有效避免长期运行线程中的资源泄漏。
禁用求解器缓存策略:通过
SolverConfiguration配置求解器,禁用内部缓存与复用机制。例如:SolverConfiguration config = SolverConfiguration.builder() .setReuseSolver(false) .build(); solver.configure(config);强制每次求解创建全新的求解器实例,避免残留旧实例的资源。
排查JNI本地资源泄漏:若使用依赖JNI的求解器(如调用本地LP库的实现),需监控本地内存使用情况。可通过JVM参数
-XX:+PrintGCDetails、-XX:+PrintGCApplicationStoppedTime分析堆内存变化,或用jmap/jhat定位未被回收的求解器对象,确认是否存在JNI层的资源未释放问题。
内容的提问来源于stack exchange,提问作者omid

