我很擅长使用Java。所以,也许我的问题将是非常基本的。我为此事先道歉。
我需要执行许多昂贵的重复计算(主要是特征值分解和乘以巨大的矩阵)。由于所有重复都是独立的,我决定同时进行。因此,我正在使用ExecutorService。
我的问题是线程内存不足,即使我使用-Xms3000m -Xmx3000m启动作业,或者我使用newSingleThreadExecutor()。我以为我有内存泄漏,但我的代码的串行版本只有80米的堆空间运行良好。更奇怪的是(至少对我来说),当我使用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的构造函数正在为每个线程创建一个模型,需要大量内存。一些崩溃后,有足够的内存来运行其余的计划线程。