使用ExecutorService时堆空间问题

时间:2012-07-17 13:01:32

标签: java multithreading heap executorservice

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

0 个答案:

没有答案