Ошибка java.lang.OutOfMemoryError: превышен лимит времени работы сборщика мусора
Я получаю следующее сообщение об ошибке при выполнении своих тестов JUnit
:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Я понимаю, что такое OutOfMemoryError
, но что означает "ограничение на время сборки мусора" (GC overhead limit)? Как я могу решить эту проблему?
5 ответ(ов)
Следующий код сработал для меня. Просто добавьте следующий фрагмент:
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"
на идентификатор вашего приложения.
Попробуйте следующее:
Откройте файл build.gradle
и добавьте или измените секцию android
следующим образом:
android {
dexOptions {
javaMaxHeapSize = "4g"
}
}
Это должно увеличить максимальный размер кучи для Java и помочь избежать проблем с нехваткой памяти при сборке вашего проекта. Не забудьте синхронизировать проект после внесения изменений в файл.
Чаще всего проблема заключается в коде. Вот простой пример:
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 раза при использовании ЛУЧШЕ метода
Стоит отметить, что это не самый лучший тест или дизайн, но когда вы сталкиваетесь с ситуацией, когда приходится реализовывать такой цикл или работать с существующим кодом, который плохо себя ведет, выбор повторного использования объектов вместо создания новых может существенно снизить количество срабатываний сборщика мусора.
Чтобы увеличить размер кучи, вам нужно немного изменить настройки, добавив следующие параметры:
Перейдите в:
Run → Run Configurations → Arguments → VM arguments
И добавьте:
-Xms1024M -Xmx2048M
Где Xms — это минимальный размер кучи, а Xmx — максимальный.
Чтобы увеличить javaMaxHeapSize
в вашем файле build.gradle
(Module: app), вы можете внести следующие изменения:
- Найдите секцию
dexOptions
в вашемbuild.gradle
файле. - Измените значение
javaMaxHeapSize
с"1g"
на"4g"
.
Вот как это будет выглядеть:
dexOptions {
javaMaxHeapSize "4g"
}
Таким образом, вы увеличите размер кучи Java для процесса сборки до 4 гигабайт.
Как работают сервлеты? Инстанцирование, сессии, общие переменные и многопоточность
Разница между StringBuilder и StringBuffer
Java 8: Преобразование List<V> в Map<K, V>
Возможные значения конфигурации hbm2ddl.auto в Hibernate и их назначение
Что такое PECS (Producer Extends Consumer Super)?