2

我对使用 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 的构造函数为每个线程创建一个模型,需要大量的内存。在一些崩溃之后,有足够的内存来运行其余的计划线程。

4

0 回答 0