在JAVA中使用cplex时如何避免内存泄漏?

在JAVA中使用cplex时如何避免内存泄漏?,java,memory-leaks,cplex,Java,Memory Leaks,Cplex,我安装了最新版本的cplex,并通过其JavaAPI使用它。 为了避免构造cplex实例的开销,我使用cplex.clearmodel,然后创建新模型 但是,当我使用它进行数千次线性规划时,内存泄漏问题非常严重。它消耗了超过2GB的内存。 是否存在任何解决方案来缓解内存泄漏问题?存在用于分析java的软件: 杰克罗菲勒 你的装备 视觉的 我以前在运行线性程序时遇到过这个问题。必须只创建一个对象,并继续仅使用对该对象的一个引用 import ilog.concert.*; import il

我安装了最新版本的cplex,并通过其JavaAPI使用它。 为了避免构造cplex实例的开销,我使用cplex.clearmodel,然后创建新模型

但是,当我使用它进行数千次线性规划时,内存泄漏问题非常严重。它消耗了超过2GB的内存。
是否存在任何解决方案来缓解内存泄漏问题?

存在用于分析java的软件:

杰克罗菲勒

你的装备

视觉的


我以前在运行线性程序时遇到过这个问题。必须只创建一个对象,并继续仅使用对该对象的一个引用

import ilog.concert.*; 
import ilog.cplex.*; 
static public class Application { 
    static public main(String[] args) { 
       try {
         IloCplex cplex = new IloCplex(); 
         // create model and solve it 
       } catch (IloException e) { 
          System.err.println("Concert exception caught: " + e); 
       }
     }
   }
这个问题是

IloCplex cplex = new IloCplex(); 
在您的程序中只调用上述行一次。如果clearModel方法不起作用,请清除所有约束、清除目标函数和单独清除剪切,然后重置约束和目标函数,但不要创建新对象。这就是导致内存泄漏的原因。要解决新模型,请使用

cplex.solve()
我想你的代码是这样的

import ilog.concert.*; 
import ilog.cplex.*; 
public class Example { 
public static void main(String[] args) { 
    try { 
      for(int i = 1;i <= 5;i++){ // Loop with indices that you may use to create your constraints and objective function.
      IloCplex cplex = new IloCplex(); // Cause of memory leak
      double[]    lb = {0.0, 0.0, 0.0}; 
      double[]    ub = {40.0, Double.MAX_VALUE, Double.MAX_VALUE}; 
      IloNumVar[] x  = cplex.numVarArray(3, lb, ub); 
      double[] objvals = {1.0, 2.0, 3.0}; 
       cplex.addMaximize(cplex.scalProd(x, objvals)); 
      cplex.addLe(cplex.sum(cplex.prod(-1.0, x[0]), 
                            cplex.prod( 1.0, x[1]), 
                            cplex.prod( 1.0, x[2])), 20.0); 
      cplex.addLe(cplex.sum(cplex.prod( 1.0, x[0]), 
                            cplex.prod(-3.0, x[1]), 
                            cplex.prod( 1.0, x[2])), 30.0); 
      if ( cplex.solve() ) { 
        cplex.out().println("Solution status = " + cplex.getStatus()); 
        cplex.out().println("Solution value  = " + cplex.getObjValue());
        double[] val = cplex.getValues(x); 
        int ncols = cplex.getNcols(); 
        for (int j = 0; j < ncols; ++j) 
           cplex.out().println("Column: " + j + " Value = " + val[j]); 
      }
      cplex.end(); 
    }
    }
    catch (IloException e) { 
System.err.println("Concert exception '" + e + "' caught"); 
    }
  }
}
导入ilog.concert.*;
导入ilog.cplex。*;
公共类示例{
公共静态void main(字符串[]args){
试试{

对于(inti=1;i,根据我对CPLEX 12.7的评估,可以在CPLEX.end()之后调用system.gc(),这可以节省大量内存。

我只创建了一个对象。正如您所说,我第一次创建对象,然后使用cplex.clearmodel清除以前的模型。我知道多次创建对象时会有更多内存泄漏,但当我只创建一次模型时,仍然存在一些内存泄漏,我们需要e清除模型以创建新模型。+1人您刚刚为我节省了我不知道有多少小时。谢谢。我的内存快疯了,现在不会超过340MB。
IloCplex cplex = new IloCplex(); // Cause of memory leak
for(int i = 1;i <= 5;i++){ // Loop with indices that you may use to create your constraints and objective function.