9

Ошибка java.lang.OutOfMemoryError: превышен лимит времени работы сборщика мусора

20

Я получаю следующее сообщение об ошибке при выполнении своих тестов JUnit:

java.lang.OutOfMemoryError: GC overhead limit exceeded

Я понимаю, что такое OutOfMemoryError, но что означает "ограничение на время сборки мусора" (GC overhead limit)? Как я могу решить эту проблему?

5 ответ(ов)

0

Следующий код сработал для меня. Просто добавьте следующий фрагмент:

android {
    compileSdkVersion 25
    buildToolsVersion '25.0.1'

    defaultConfig {
        applicationId "yourpackage"
        minSdkVersion 10
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }
    dexOptions {
        javaMaxHeapSize "4g"
    }
}

Убедитесь, что вы заменили "yourpackage" на идентификатор вашего приложения.

0

Попробуйте следующее:

Откройте файл build.gradle и добавьте или измените секцию android следующим образом:

android {
    dexOptions {
        javaMaxHeapSize = "4g"
    }
}

Это должно увеличить максимальный размер кучи для Java и помочь избежать проблем с нехваткой памяти при сборке вашего проекта. Не забудьте синхронизировать проект после внесения изменений в файл.

0

Чаще всего проблема заключается в коде. Вот простой пример:

import java.util.*;

public class GarbageCollector {

    public static void main(String... args) {

        System.out.printf("Тестирование...%n");
        List<Double> list = new ArrayList<Double>();
        for (int outer = 0; outer < 10000; outer++) {

            // list = new ArrayList<Double>(10000); // ПЛОХО
            // list = new ArrayList<Double>(); // ЕЩЁ ХУЖЕ
            list.clear(); // ЛУЧШЕ

            for (int inner = 0; inner < 10000; inner++) {
                list.add(Math.random());
            }

            if (outer % 1000 == 0) {
                System.out.printf("Внешний цикл на %d%n", outer);
            }

        }
        System.out.printf("Готово.%n");
    }
}

Я использовал Java 1.6.0_24-b07 на Windows 7 32 бита.

java -Xloggc:gc.log GarbageCollector

Затем посмотрите на gc.log:

  • Сборщик мусора срабатывал 444 раза при использовании ПЛОХО метода
  • 666 раз при использовании ЕЩЁ ХУЖЕ метода
  • 354 раза при использовании ЛУЧШЕ метода

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

0

Чтобы увеличить размер кучи, вам нужно немного изменить настройки, добавив следующие параметры:

Перейдите в:

Run → Run Configurations → Arguments → VM arguments

И добавьте:

-Xms1024M -Xmx2048M

Где Xms — это минимальный размер кучи, а Xmx — максимальный.

0

Чтобы увеличить javaMaxHeapSize в вашем файле build.gradle (Module: app), вы можете внести следующие изменения:

  1. Найдите секцию dexOptions в вашем build.gradle файле.
  2. Измените значение javaMaxHeapSize с "1g" на "4g".

Вот как это будет выглядеть:

dexOptions {
    javaMaxHeapSize "4g"
}

Таким образом, вы увеличите размер кучи Java для процесса сборки до 4 гигабайт.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь