Błąd java.lang.OutOfMemoryError: GC overhead limit exceeded

Pojawia się komunikat o błędzie podczas wykonywania testów JUnit:

java.lang.OutOfMemoryError: GC overhead limit exceeded

Wiem, co to jest OutOfMemoryError, ale co oznacza GC overhead limit? Jak mogę to rozwiązać?

Author: Ravindra babu, 2009-09-08

20 answers

Ta wiadomość oznacza, że z jakiegoś powodu garbage collector zajmuje zbyt dużo czasu (domyślnie 98% całego czasu procesora) i odzyskuje bardzo mało pamięci w każdym uruchomieniu (domyślnie 2% sterty).

To skutecznie oznacza, że twój program przestaje robić jakiekolwiek postępy i jest zajęty tylko pobieraniem śmieci przez cały czas.

Aby uniemożliwić aplikacji pochłonięcie czasu procesora bez uzyskania niczego zrobić, JVM rzuca to Error tak, że masz szansę zdiagnozować problem.

Rzadkie przypadki, w których widziałem, że tak się dzieje, to przypadki, w których jakiś kod tworzył Tony tymczasowych obiektów i Tony słabo odwołujących się obiektów w środowisku już bardzo ograniczonym pamięcią.

Sprawdź Przewodnik Java Gc tuning guide, który jest dostępny dla różnych wersji Javy i zawiera sekcje dotyczące tego konkretnego problemu:

 791
Author: Joachim Sauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-02 09:41:08

Cytowanie z artykułu Oracle"Java SE 6 HotSpot [tm] Virtual Machine Garbage Collection Tuning":

Nadmierny czas GC i OutOfMemoryError

Kolektor równoległy wyrzuci błąd OutOfMemoryError, jeśli zbyt dużo czasu jest spędzane w garbage Collector: jeśli więcej niż 98% całkowitego czasu jest spędzone w garbage collector i mniej niż 2% sterty jest odzyskane, OutOfMemoryError zostanie wyrzucony. Ta funkcja ma na celu zapobieganie aplikacje są uruchamiane przez dłuższy okres czasu, jednocześnie robiąc niewielki lub żaden postęp, ponieważ sterta jest zbyt mała. W razie potrzeby tę funkcję można wyłączyć, dodając opcję -XX:-UseGCOverheadLimit do wiersza poleceń.

EDIT: wygląda na to, że ktoś umie pisać szybciej ode mnie:)

 222
Author: dave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Jeśli jesteś pewien, że nie ma wycieków pamięci w twoim programie, spróbuj:

  1. Zwiększ rozmiar sterty, na przykład -Xmx1g.
  2. Włącz równoległy kolektor niskiej pauzy -XX:+UseConcMarkSweepGC.
  3. Użyj ponownie istniejących obiektów, jeśli to możliwe, aby zapisać trochę pamięci.

W razie potrzeby, sprawdzanie limitu można wyłączyć, dodając opcję -XX:-UseGCOverheadLimit do wiersza poleceń.

 98
Author: Vitalii Fedorenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-14 01:44:17

To zwykle kod. Oto prosty przykład:

import java.util.*;

public class GarbageCollector {

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

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

            // list = new ArrayList<Double>(10000); // BAD
            // list = new ArrayList<Double>(); // 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");
    }
}

Używanie Javy 1.6.0_24-b07 na Windows 7 32 bit.

java -Xloggc:gc.log GarbageCollector

Następnie spójrz na gc.log

  • wywołane 444 razy przy użyciu złej metody
  • wywołane 666 razy gorszą metodą
  • wyzwalane 354 razy przy użyciu lepszej metody

Teraz przyznam, że nie jest to najlepszy test lub najlepszy projekt, ale w obliczu sytuacji, w której nie masz wyboru, jak tylko wdrożyć taką pętlę lub gdy masz do czynienia z istniejący kod, który zachowuje się źle, wybierając ponowne użycie obiektów zamiast tworzenia nowych, może zmniejszyć liczbę razy, kiedy garbage collector stanie na drodze...

 48
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-08 06:04:18

Przyczyna błędu zgodnie z Java [8] Platform, Standard Edition Troubleshooting Guide: (podkreślenie i podziały linii dodane)

[...] "GC overhead limit exceeded" wskazuje, że garbage collector działa cały czas, a program Java robi bardzo wolne postępy.

Po zbiorze śmieci, jeśli proces Java poświęca więcej niż około 98% swojego czasu na zbiórkę śmieci i jeśli odzyskuje mniej niż 2% sterty i robi do tej pory ostatnie 5 (stała czasowa kompilacji) kolejnych zbiorów śmieci, następnie wyrzuca się java.lang.OutOfMemoryError. [...]

  1. Zwiększ rozmiar sterty Jeśli bieżąca sterta nie wystarczy.
  2. Jeśli nadal pojawia się ten błąd po zwiększeniu pamięci sterty, użyj narzędzi do profilowania pamięci , takich jak MAT (Narzędzie analizatora pamięci), Visual VM itd.i napraw wycieki pamięci.
  3. Upgrade JDK do najnowszej wersji (1.8.x) lub co najmniej 1,7.x i użyć algorytmu G1GC. . Cel przepustowości dla G1 GC wynosi 90% czasu aplikacji i 10% czasu zbierania śmieci
  4. Oprócz ustawienia pamięci sterty za pomocą- Xms1g -Xmx2g, Spróbuj

    -XX:+UseG1GC -XX:G1HeapRegionSize=n -XX:MaxGCPauseMillis=m  
    -XX:ParallelGCThreads=n -XX:ConcGCThreads=n
    

Spójrz na kilka bardziej powiązanych pytań dotyczących G1GC

 36
Author: Ravindra babu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-07 22:49:28

Po prostu zwiększ rozmiar sterty, ustawiając tę opcję w

Uruchom → Uruchom konfiguracje → argumenty → argumenty VM

-Xms1024M -Xmx2048M

Xms - dla minimalnego limitu

Xmx - dla maksymalnego limitu

 29
Author: chopss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-23 14:04:37

Spróbuj tego

Otwórz plik build.gradle

  android {
        dexOptions {
           javaMaxHeapSize = "4g"
        }
   }
 13
Author: alicanozkara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-23 18:09:56

Dla mnie działały następujące kroki:

  1. Otwórz plik eclipse.ini
  2. Zmień

    -Xms40m
    -Xmx512m
    

    Do

    -Xms512m
    -Xmx1024m
    
  3. Restart Eclipse

Zobacz tutaj

 13
Author: Sunil Kumar Sahoo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-23 07:35:49

Następujące zadziałały dla mnie. Wystarczy dodać następujący fragment:

android {
        compileSdkVersion 25
        buildToolsVersion '25.0.1'

defaultConfig {
        applicationId "yourpackage"
        minSdkVersion 10
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }
dexOptions {
        javaMaxHeapSize "4g"
    }
}
 11
Author: Hoshouns,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-27 11:47:41

Zwiększ javaMaxHeapsize w swojej kompilacji.gradle (Module:app) file

dexOptions {
    javaMaxHeapSize "1g"
}

To (dodaj ten wiersz w gradle)

 dexOptions {
        javaMaxHeapSize "4g"
    }
 7
Author: Sai Gopi Me,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-07 12:27:08

Możesz również zwiększyć alokację pamięci i rozmiar sterty, dodając to do pliku gradle.properties:

org.gradle.jvmargs=-Xmx2048M -XX\:MaxHeapSize\=32g

Nie musi być 2048M i 32g, żeby był tak duży, jak chcesz.
 4
Author: John Doe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-23 21:03:58

Rozwiązany:
Wystarczy dodać
org.gradle.jvmargs=-Xmx1024m
w
gradle.properties
a jeśli nie istnieje, stwórz go.

 4
Author: reza_khalafi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-22 09:53:06

Java heap size descriptions (xms, xmx, xmn)

-Xms size in bytes

Example : java -Xms32m

Ustawia początkowy rozmiar sterty Javy. Domyślny rozmiar to 2097152 (2MB). Wartości muszą być wielokrotnością i większą niż 1024 bajtów (1KB). (Flaga-server zwiększa domyślny rozmiar do 32M.)

-Xmn size in bytes

Example : java -Xmx2m

Ustawia początkowy rozmiar sterty Javy dla generacji Eden. Wartość domyślna to 640K. (Flaga-server zwiększa domyślny rozmiar do 2M.)

-Xmx size in bytes

Example : java -Xmx2048m

Ustawia maksymalny rozmiar, do którego Java sterta może rosnąć. Domyślny rozmiar to 64M. (Flaga-server zwiększa domyślny rozmiar do 128M.) Maksymalny limit sterty wynosi około 2 GB (2048MB).

Argumenty pamięci Java (XMS, xmx, XMN) formatowanie

Podczas ustawiania Java heap size, należy podać swój argument memory używając jednej z liter "m" lub "M" dla MB lub "g" lub " G " Dla GB. Ustawienie NIE będzie działać, jeśli podasz "MB" lub " GB."Poprawne argumenty wyglądają tak:

- Xms64m lub-Xms64M - Xmx1g lub - Xmx1G Można również użyć 2048MB do określenia 2GB Upewnij się również, że używasz tylko liczb całkowitych przy określaniu argumentów. Użycie opcji-Xmx512m jest poprawną opcją, ale opcja-Xmx0. 5g spowoduje błąd.

To odniesienie może być pomocne dla kogoś.

 3
Author: Phoenix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-10 09:09:00

Pracuję w Android Studio i napotkałem ten błąd podczas próby wygenerowania podpisanego pliku APK do wydania. Byłem w stanie zbudować i przetestować APK debugowania bez problemu, ale jak tylko chciałem zbudować APK release, proces budowania trwał kilka minut, a następnie ostatecznie zakończyć się "błąd java.lang.OutOfMemoryError: GC overhead limit exceeded". Zwiększyłem rozmiary sterty zarówno dla maszyny wirtualnej, jak i kompilatora Android DEX, ale problem utrzymywał się. Wreszcie, po wielu godzinach i kubki kawy okazało się, że problem był w mojej app-level 'build.gradle 'file - miałem parametr' minifyEnabled 'dla typu release build ustawiony na 'false', w konsekwencji uruchamiając ProGuard stuffs na kodzie, który nie przeszedł procesu zmniejszania kodu (zobacz https://developer.android.com/studio/build/shrink-code.html ). Zmieniłem parametr 'minifyEnabled' na 'true' I release build wykonałem jak marzenie:)

Krótko mówiąc, musiałem zmienić mój poziom aplikacji buduj.plik gradle ' a z: //...

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
    }
}

//...

Do

    //...

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
Author: Alex Ivan Howard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-07 22:33:42

Aby zwiększyć rozmiar sterty w IntelliJ IDEA postępuj zgodnie z poniższymi instrukcjami. U mnie zadziałało.

Dla Użytkowników Windows,

Przejdź do miejsca, w którym zainstalowano IDE i wyszukaj następujące.

idea64.exe.vmoptions

Edytuj plik i dodaj następujący plik.

-Xms512m
-Xmx2024m
-XX:MaxPermSize=700m
-XX:ReservedCodeCacheSize=480m
To jest to !!
 0
Author: Dulith De Costa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-14 13:16:24

Możesz spróbować wprowadzić zmiany w ustawieniach serwera, odwołując się do tego obrazu i zwiększyć rozmiar pamięci do przetwarzania zmiany procesu zaznaczone na Żółto

Możesz również wprowadzić zmiany w Java heap, otwierając cmd-> set _java_opts -Xmx2g
2g (2gigabajty) w zależności od złożoności programu

Spróbuj użyć mniej zmiennych stałych i zmiennych temp

Tutaj wpisz opis obrazka

 0
Author: Rahul Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-27 02:40:16

Musisz zwiększyć rozmiar pamięci w Jdeveloper przejdź do setDomainEnv.cmd .

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**
)

I

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
Author: shashi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-13 09:54:16

W Netbeans pomocne może być zaprojektowanie maksymalnego rozmiaru sterty. Przejdź do Run => Ustaw konfigurację projektu => customize . W oknie Uruchom, Przejdź do opcji VM, wypełnij -Xms2048m -Xmx2048m. To może rozwiązać problem wielkości sterty.

 -1
Author: Xiaogang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-09 07:26:13

Nie wiem, czy to jest nadal istotne, czy nie, ale po prostu chcę podzielić się tym, co działało dla mnie.

Zaktualizuj wersję Kotlina do najnowszej dostępnej. https://blog.jetbrains.com/kotlin/category/releases/

I gotowe.

 -1
Author: androidStud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-25 03:41:41

Ponowne uruchomienie mojego MacBooka naprawiło ten problem dla mnie.

 -3
Author: Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-26 17:23:05