我安裝了最新版本的cplex,並通過它的JAVA API使用它。 爲了避免構建cplex實例的開銷,我使用cplex.clearmodel,然後創建新模型。在JAVA中使用cplex時如何避免內存泄漏?
但是當我用它做數千次線性編程時,內存泄漏問題非常嚴重。它消耗了超過2GB的RAM。 是否存在緩解內存泄漏問題的解決方案?
我安裝了最新版本的cplex,並通過它的JAVA API使用它。 爲了避免構建cplex實例的開銷,我使用cplex.clearmodel,然後創建新模型。在JAVA中使用cplex時如何避免內存泄漏?
但是當我用它做數千次線性編程時,內存泄漏問題非常嚴重。它消耗了超過2GB的RAM。 是否存在緩解內存泄漏問題的解決方案?
我以前在運行我的線性程序時遇到過這個問題。您必須創建一個對象並繼續僅使用該對象的一個引用。
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");
}
}
}
東西
的或在您創建的IloCplex對象的實例後,循環啓動。因此,相對於上面的代碼,做
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.
存在着軟件分析的java:
的JProfiler
http://www.ej-technologies.com/products/jprofiler/overview.html
Yourkit
VisualVM的
基於我對CPLEX 12.7評價,你可以調用cplex.end()後的System.gc(),這可以節省大量的內存。
我只創建一個對象。就像你說的,我第一次創建對象,然後使用cplex.clearmodel來清除以前的模型。我知道多次創建對象時會有更多的內存泄漏,但是當我創建一次模型並使用清晰的模型創建新模型時,仍然存在一些內存泄漏。 –
+1你剛剛救了我的男人我不知道多少個小時。謝謝。我的記憶變得瘋狂,現在它不超過340 MB。 –