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ć?
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:
-
Java 11 tuning guide ma dedykowane sekcje na temat GC dla różnych śmieci kolektory:
- dla kolektora równoległego
- dla kolektora współbieżny Mark Sweep (CMS)
- nie ma wzmianki o tym szczególnym stanie błędu dla Garbage First (G1) collector.
- Java 8 tuning guide i jego nadmierna sekcja GC
- Java 6 tuning guide i jego nadmierna sekcja GC.
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:)
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:
- Zwiększ rozmiar sterty, na przykład
-Xmx1g
. - Włącz równoległy kolektor niskiej pauzy
-XX:+UseConcMarkSweepGC
. - 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ń.
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...
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
. [...]
- Zwiększ rozmiar sterty Jeśli bieżąca sterta nie wystarczy.
- 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.
- 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
-
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
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
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"
}
}
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:
- Otwórz plik
eclipse.ini
-
Zmień
-Xms40m -Xmx512m
Do
-Xms512m -Xmx1024m
-
Restart Eclipse
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"
}
}
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"
}
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
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
wgradle.properties
a jeśli nie istnieje, stwórz go.
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ś.
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
}
}
//...
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 !!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
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**
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.
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.
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.
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