Ошибка java.lang.OutOfMemoryError: Превышен лимит накладных расходов GC

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

java.lang.OutOfMemoryError: GC overhead limit exceeded

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

Комментарии к вопросу (10)
Решение

Это сообщение означает, что по какой-то причине сборщик мусора занимает чрезмерное количество времени (по умолчанию 98% всего процессорного времени процесса) и восстанавливает очень мало памяти в каждом запуске (по умолчанию 2% от кучи).

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

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

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

Подробности смотрите в этой статье (в частности, в этой части).

Комментарии (14)

GC выбрасывает это исключение, когда слишком много времени тратится на сборку мусора при слишком малой отдаче, например, 98% времени процессора тратится на GC, а восстанавливается менее 2% кучи.

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

Вы можете отключить эту функцию с помощью опции командной строки -XX:-UseGCOverheadLimit.

Дополнительная информация [здесь] (http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html#par_gc.oom)

EDIT: похоже, кто-то может печатать быстрее меня :)

Комментарии (6)

Если вы уверены, что там нет утечки памяти в вашу программу, попробуйте:

  1. Увеличить размер кучи, например-Xmx1g`.
  2. Включить в спутном коллектор пауза -начала XX:+UseConcMarkSweepGC.
  3. Повторное использование существующих объектов, когда можно сэкономить память.

При необходимости, проверка лимита может быть отключена путем добавления опции -ХХ:-UseGCOverheadLimit в командной строке.

Комментарии (1)

Обычно это код. Вот простой пример:

import java.util.*;

public class GarbageCollector {

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

        System.out.printf("Testing...%n");
        List list = new ArrayList();
        for (int outer = 0; outer < 10000; outer++) {

            // list = new ArrayList(10000); // BAD
            // list = new ArrayList(); // WORSE
            list.clear(); // BETTER

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

            if (outer % 1000 == 0) {
                System.out.printf("Outer loop at %d%n", outer);
            }

        }
        System.out.printf("Done.%n");
    }
}

Использую java 1.6.0_24-b07 На Windows7 32 bit.

java -Xloggc:gc.log GarbageCollector

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

  • Срабатывание 444 раза при использовании метода BAD
  • Срабатывание 666 раз при использовании ХУДОЖЕСТВЕННОГО метода
  • Срабатывание 354 раза при использовании ЛУЧШЕГО метода

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

Комментарии (1)

Причиной Ошибка

накладные лимит превышен ГК" не означает, что сборщик мусора работает все время и Java-программы это делать очень медленно.

После сборки мусора, если Java-процесс тратит больше, чем примерно 98% своего времени делает вывоз мусора и если он восстанавливается менее чем 2% кучи и занимается до сих пор последние 5 (время компиляции константу) последовательных сборки, то Ява.яз.Исключение OutOfMemoryError бросается

  1. Увеличить размер кучи если текущая кучи не хватает.
  2. Если вы все еще получаете эту ошибку после увеличения памяти, использования памяти инструменты профилирования как мат ( Памяти анализатора), визуальный ВМ и т. д. и исправление утечек памяти.
  3. Обновление версии JDK до последней версии ( 1.8.х) или не менее 1,7.алгоритм х и использовать G1GC. . Цели пропускной способности для Г1 ГК составляет 90% времени и 10% времени сбора мусора
  4. Помимо динамической памяти с -Xms1g -Xmx2g , попробуйте

-Начала XX:+UseG1GC -ХХ:G1HeapRegionSize=Н -начала XX:MaxGCPauseMillis=м -ХХ:ParallelGCThreads=Н-ХХ:ConcGCThreads=Н

Взгляните на еще некоторые вопросы относительно G1GC

https://stackoverflow.com/questions/8111310/java-7-jdk-7-garbage-collection-and-documentation/34254605#34254605

https://stackoverflow.com/questions/2254041/java-g1-garbage-collection-in-production/34254401#34254401

Оракул technetwork статьи для отладки ГК

Комментарии (0)

Просто увеличить размер кучи немного, установив этот параметр в

Запуск конфигурации → выполнить → Аргументы → аргументы ВМ

в

-Xms1024M -Xmx2048M

Функции - для минимального предела

Сайт Xmx - для максимального предела

Комментарии (5)

Для меня, следующие этапы работы:

  1. Откройте затмение.файл ini
  2. Изменение

в

-Xms40m -Xmx512m

для

в

-Xms512m -Xmx1024m

  1. Перезапустите Eclipse

См. здесь

Комментарии (6)

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

android {
        compileSdkVersion 25
        buildToolsVersion '25.0.1'

defaultConfig {
        applicationId "yourpackage"
        minSdkVersion 10
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }
dexOptions {
        javaMaxHeapSize "4g"
    }
}
Комментарии (2)

попробуйте это

открыть построить.файл Gradle`

  android {
        dexOptions {
           javaMaxHeapSize = "4g"
        }
   }
Комментарии (1)

увеличение javaMaxHeapsize в сборке.Gradle в(модуль:приложения) файла

dexOptions {
    javaMaxHeapSize "1g"
}

на (добавьте эту строку в Gradle)

 dexOptions {
        javaMaxHeapSize "4g"
    }
Комментарии (0)

Ява описания размер кучи (отправляй по xms, Xmx значение, xmn аэропорт)

-Xms size in bytes

Example : java -Xms32m

Устанавливает начальный размер "кучи" Java. Размер по умолчанию-2097152 (2 МБ). Значения должны быть кратными, и больше, чем 1024 байта (1 КБ). (К -серверу флаг увеличивает размер по умолчанию 32М.)

-Xmn size in bytes

Example : java -Xmx2m

Устанавливает начальный размер кучи Java для генерации Иден. Значение по умолчанию-640К. (Интернет -сервер флаг увеличивает размер по умолчанию 2М.)

-Xmx size in bytes

Example : java -Xmx2048m

Задает максимальный размер кучи Java может расти. Размер по умолчанию-64М. (Интернет -сервер флаг увеличивает размер по умолчанию для 128М.) Максимальный лимит кучи около 2 ГБ (2048 Мб).

Аргументы Java памяти (xms, Xmx значение, xmn аэропорт) форматирование

При определении размера кучи Java, вы должны указать ваш аргумент памяти, используя одну из букв “M” или “M” для Мб, или “G” или “G” для ГБ. Ваша установка не будет работать, если вы укажите “МБ” и “ГБ”. Веские аргументы выглядят так:

-Xms64m или -Xms64M -Xmx1g или -Xmx1G Также можно использовать, чтобы указать 2048 Мб 2 ГБ Также, убедитесь, что вы просто использовать целые числа при указании аргументов. Используя -Xmx512m-это допустимый вариант, но -Xmx0.5г приведет к ошибке.

Эта ссылка может быть полезной для кого-то.

Комментарии (0)

Перезагрузка моего MacBook исправила эту проблему для меня.

Комментарии (0)

Вы также можете увеличить объем памяти и размер кучи, добавляя это к вашему `градля.файл свойств:

орг.градля.jvmargs=-Xmx2048M -XX веков\:MaxHeapSize\=32г

Это не'т должны быть 2048M и 32г, сделать его как большой, как вы хотите.

Комментарии (0)

Чтобы увеличить размер кучи в IDEA IntelliJ следуйте следующей инструкции. Он работал для меня.

Для Пользователей Windows,

Перейдите к расположению, где IDE установлено и искать следующую.

idea64.exe.vmoptions

Откройте файл и добавьте следующие.

-Xms512m
-Xmx2024m
-XX:MaxPermSize=700m
-XX:ReservedCodeCacheSize=480m

Что это !!

Комментарии (0)

Я'м работает в Android Studio и столкнулся с этой ошибкой при попытке создать подписанный APK для релиза. Я был в состоянии построить и протестировать отладка Android игры без проблем, но как только я захотел построить выпустить АПК, процесс сборки будет работать в течение нескольких минут и затем, наконец, завершить с помощью "Ошибка Java.яз.Исключение OutOfMemoryError: GC и накладные расходы превышен лимит на". Я увеличил размер кучи для виртуальной машины и компилятор Андроид Декс, но проблема сохраняется. Наконец, после многих часов и кружек кофе выяснилось, что проблема была в моем приложении-уровень 'построить.Gradle в' файл - я 'minifyEnabled' параметр для построения релиза тип 'ложь', следовательно запуск программы ProGuard питания на код, который еще'т быть через код-застенчивая' процесс (см. https://developer.android.com/studio/build/shrink-code.html). Я изменил 'minifyEnabled' параметр 'правда' и сборка выполняются как сон :)

Короче, мне пришлось изменить мои приложения-уровень 'построить.Gradle в' файл с: //...

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.sign_config_release
    }
    debug {
        debuggable true
        signingConfig signingConfigs.sign_config_debug
    }
}

//...

для

    //...

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.sign_config_release
    }
    debug {
        debuggable true
        signingConfig signingConfigs.sign_config_debug
    }
}

//...
Комментарии (0)

Вам нужно увеличить размер памяти в Jdeveloper иди на setDomainEnv.УМК.

set WLS_HOME=%WL_HOME%\server    
set XMS_SUN_64BIT=**256**
set XMS_SUN_32BIT=**256**
set XMX_SUN_64BIT=**3072**
set XMX_SUN_32BIT=**3072**
set XMS_JROCKIT_64BIT=**256**
set XMS_JROCKIT_32BIT=**256**
set XMX_JROCKIT_64BIT=**1024**
set XMX_JROCKIT_32BIT=**1024**

if "%JAVA_VENDOR%"=="Sun" (
    set WLS_MEM_ARGS_64BIT=**-Xms256m -Xmx512m**
    set WLS_MEM_ARGS_32BIT=**-Xms256m -Xmx512m**
) else (
    set WLS_MEM_ARGS_64BIT=**-Xms512m -Xmx512m**
    set WLS_MEM_ARGS_32BIT=**-Xms512m -Xmx512m**
)

и

set MEM_PERM_SIZE_64BIT=-XX:PermSize=**256m**
set MEM_PERM_SIZE_32BIT=-XX:PermSize=**256m**

if "%JAVA_USE_64BIT%"=="true" (
    set MEM_PERM_SIZE=%MEM_PERM_SIZE_64BIT%
) else (
    set MEM_PERM_SIZE=%MEM_PERM_SIZE_32BIT%
)

set MEM_MAX_PERM_SIZE_64BIT=-XX:MaxPermSize=**1024m**
set MEM_MAX_PERM_SIZE_32BIT=-XX:MaxPermSize=**1024m**
Комментарии (1)

Решена: Просто добавить орг.градля.jvmargs=-Xmx1024m в `градля.свойства и если он не существует, создайте его.

Комментарии (0)

В NetBeans, он может оказаться полезным для разработки максимальный размер кучи. Перейти в Выполнить => настройка конфигурации проекта => Персонализация. В выполнить его всплыло окно, перейдите к ВМ, заполнить -Xms2048m -Xmx2048m. Это может решить проблемы размера кучи.

Комментарии (0)