OutOfMemoryError при использовании API сплава для Java

java api out-of-memory alloy

94 просмотра

1 ответ

68 Репутация автора

На этот вопрос уже есть ответ здесь:

У меня есть модель Alloy, которая при запуске в инструменте Alloy (loy4.2.jar) генерирует экземпляры без каких-либо проблем. Но когда я использую эту же модель в качестве входных данных для API Alloy в Java, чтобы получить все эти экземпляры, один за другим, через некоторое время генерируется ошибка нехватки памяти (многие экземпляры захватываются до появления ошибки).

Ошибка возникает именно в команде if, расположенной сразу после команды try (что далее соответствует JDolly.java:192 в трассировке стека печати) в приведенном ниже коде:

@Override
    public boolean hasNext() {
        // primeira vez
        if (firstTime) initializeAlloyAnalyzer();
        if (currentAns.satisfiable() && firstTime) {            
            firstTime = false;
            return true;
        }

        if (maximumPrograms > 0 && maximumPrograms == currentProgram) return false;

        boolean result = true;

        try {
            if (!currentAns.next().satisfiable() || currentAns.equals(currentAns.next())){
                result = false; 
                System.out.println("TARCIANA -- non satisfiable, linha 194");
            } else {
                currentAns = currentAns.next();
            }

        } catch (Err e) {
            result = false;
            e.printStackTrace();
        }

        return result;
    }

Трассировка стека печати этой ошибки:

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
    at kodkod.util.collections.IdentityHashSet.<init>(IdentityHashSet.java:162)
    at kodkod.util.nodes.AnnotatedNode$SharingDetector.sharedNodes(AnnotatedNode.java:278)
    at kodkod.util.nodes.AnnotatedNode.<init>(AnnotatedNode.java:92)
    at kodkod.util.nodes.AnnotatedNode.annotate(AnnotatedNode.java:114)
    at kodkod.engine.fol2sat.Translator.evaluate(Translator.java:104)
    at kodkod.engine.Evaluator.evaluate(Evaluator.java:117)
    at edu.mit.csail.sdg.alloy4compiler.translator.A4Solution.rename(A4Solution.java:844)
    at edu.mit.csail.sdg.alloy4compiler.translator.A4Solution.rename(A4Solution.java:841)
    at edu.mit.csail.sdg.alloy4compiler.translator.A4Solution.rename(A4Solution.java:824)
    at edu.mit.csail.sdg.alloy4compiler.translator.A4Solution.<init>(A4Solution.java:330)
    at edu.mit.csail.sdg.alloy4compiler.translator.A4Solution.next(A4Solution.java:1031)
    at ejdolly.JDolly.hasNext(JDolly.java:192)
    at org.testorrery.ForLoopIterator.hasNext(ForLoopIterator.java:40)
    at refactoringTest.RefactoringTest.runTests(RefactoringTest.java:141)
    at refactoringTest.MainRunner.main(MainRunner.java:83)

Я думаю, что причина этой ошибки может быть такой же, как описано в: CapacityExceededException при чтении очень большого экземпляра с использованием A4SolutionReader

Любые предложения, чтобы избежать этой ошибки?

Автор: Tarciana Источник Размещён: 10.02.2016 09:33

Ответы (1)


0 плюса

420 Репутация автора

Решения (т.е. экземпляры A4Solutionкласса) в Alloy организованы в виде связанного списка, это означает, что вызов по nextсуществу вычислит следующее решение на основе заданного и поместит его в список, связав его с текущим решением.

Если вы генерируете много решений, в то время как все они хранятся, в конечном итоге исключение нехватки памяти обязательно будет выброшено.

Вам, вероятно, следует проверить, что вы не сохраняете ссылки на все решения (или только первое) и, таким образом, не допускаете их сбора мусора.

Автор: ivcha Размещён: 01.03.2016 07:12
Вопросы из категории :
32x32