我对使用 Java 很陌生。所以,也许我的问题将是非常基本的。我为此提前道歉。
我需要执行许多昂贵的重复计算(主要是特征值分解和乘以巨大的矩阵)。由于所有重复都是独立的,我决定同时进行。因此,我为此使用 ExecutorService。
我的问题是线程内存不足,即使我使用 -Xms3000m -Xmx3000m 启动作业,或者我使用 newSingleThreadExecutor()。我以为我有内存泄漏,但我的代码的串行版本运行良好,只有 80m 的堆空间。更奇怪的是(至少对我来说),当我使用 newFixedThreadPool() 时,在第一个线程 (~15) 崩溃后,计算工作并且使用的堆开始下降(使用 NetBeans 分析)。
我也试过 executor.execute() 和 executor.submit() 没有区别。
我在我正在使用的代码下面发布:
ExecutorService executor = Executors.newFixedThreadPool(12);
double totalMaximumLikelihood = 0.0;
Iterator iterator1 = myAlignment.columnsMap.keySet().iterator();
while (iterator1.hasNext()) {
boolean pairToBeCalculated = false;
ArrayList<String> myKey1 = (ArrayList) iterator1.next();
Iterator iterator2 = myAlignment.columnsMap.keySet().iterator();
while (iterator2.hasNext()) {
ArrayList myKey2 = (ArrayList) iterator2.next();
if (pairToBeCalculated == true) {
Runnable worker = new MySingleCoevolutionRunnable(myKnotsInNewickTree, queryNode, myAlignment, myMeanPosteriorRates, myKey1, myKey2);
//executor.submit(worker);
executor.execute(worker);
} else if (myKey1.equals(myKey2)) {
pairToBeCalculated = true;
}
}
}
executor.shutdown();
编辑:看来我犯了一个新手错误。当线程被调度时,runnable 的构造函数为每个线程创建一个模型,需要大量的内存。在一些崩溃之后,有足够的内存来运行其余的计划线程。