Podczas wykonywania testów JUnit pojawia się ten komunikat o błędzie:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Wiem, co to OutOfMemoryError
jest, ale co oznacza limit napowietrzny GC? Jak mogę to rozwiązać?
Podczas wykonywania testów JUnit pojawia się ten komunikat o błędzie:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Wiem, co to OutOfMemoryError
jest, ale co oznacza limit napowietrzny GC? Jak mogę to rozwiązać?
OutOfMemoryError
scenariuszy, dla których zwiększenie sterty nie jest prawidłowym rozwiązaniem: wyczerpanie wątków natywnych i wyczerpanie uprawnień generatora (które jest oddzielne od stosu) to dwa przykłady. Zachowaj ostrożność przy składaniu zbyt ogólnych oświadczeń na tematOutOfMemoryErrors
; istnieje nieoczekiwanie różnorodny zestaw rzeczy, które mogą je powodować.Odpowiedzi:
Ten komunikat oznacza, że z jakiegoś powodu śmieciarz zajmuje zbyt dużo czasu (domyślnie 98% całego czasu procesora w procesie) i odzyskuje bardzo mało pamięci przy każdym uruchomieniu (domyślnie 2% sterty).
Oznacza to skutecznie, że Twój program przestaje robić postępy i jest cały czas zajęty tylko wyrzucaniem elementów bezużytecznych.
JVM rzuca to,
Error
aby Twoja aplikacja nie pochłaniała czasu procesora bez wykonywania czegokolwiek, dzięki czemu masz szansę zdiagnozować problem.Rzadkie przypadki, w których to widziałem, polegały na tym, że jakiś kod tworzył mnóstwo tymczasowych obiektów i ton słabo przywoływanych obiektów w już bardzo ograniczonym pamięci.
Sprawdź przewodnik strojenia Java GC, który jest dostępny dla różnych wersji Java i zawiera sekcje dotyczące tego konkretnego problemu:
źródło
Cytując z artykułu Oracle „Java SE 6 HotSpot [tm] Tuning czyszczenia maszyn wirtualnych” :
EDYCJA: wygląda na to, że ktoś może pisać szybciej niż ja :)
źródło
-XX:
początku kilku opcji wiersza polecenia jest flagą, wskazującą, że ta opcja jest wysoce specyficzna dla maszyny wirtualnej i niestabilna (może ulec zmianie bez powiadomienia w przyszłych wersjach). W każdym razie-XX:-UseGCOverheadLimit
flaga informuje maszynę wirtualną, aby wyłączyła sprawdzanie limitu narzutu GC (faktycznie „wyłącza”), podczas gdy twoje-Xmx
polecenie jedynie zwiększyło stos. W tym drugim przypadku sprawdzanie narzutu GC nadal działało , to po prostu brzmi jak większa kupa rozwiązała problemy z przerzucaniem GC w twoim przypadku (nie zawsze to pomoże).Jeśli masz pewność, że w twoim programie nie ma wycieków pamięci , spróbuj:
-Xmx1g
.-XX:+UseConcMarkSweepGC
.W razie potrzeby kontrolę limitu można wyłączyć, dodając opcję
-XX:-UseGCOverheadLimit
do wiersza poleceń.źródło
List
obiektu wewnątrz pętli spowodowało wywołanie GC 39 razy zamiast 22 razy.Zwykle jest to kod. Oto prosty przykład:
Korzystanie z Java 1.6.0_24-b07 w 32-bitowym systemie Windows 7.
Następnie spójrz na
gc.log
Przyznaję, że nie jest to najlepszy test ani najlepszy projekt, ale w obliczu sytuacji, w której nie masz innego wyboru, jak zaimplementować taką pętlę lub gdy masz do czynienia z istniejącym kodem, który źle się zachowuje, wybór ponownego użycia obiektów zamiast tworzenia nowych może zmniejszyć ile razy kolektor śmieci przeszkadza ...
źródło
gc.log
pliku. Moje testy pokazują znacznie mniej razy ogólnie, ale najmniej razy „wyzwalaczy” dla LEPSZEJ, a teraz BAD jest „gorszy” niż WORST teraz. Moje liczby: ZŁE: 26, GORNE: 22, LEPSZE 21.List<Double> list
w zewnętrznej pętli , a nie przed zewnętrznej pętli i wyzwalane 39 zbiory śmieci.Przyczyna błędu według platformy Java [8], Podręcznik rozwiązywania problemów w edycji standardowej : (wyróżnienie i podział wierszy dodane)
Oprócz ustawienia pamięci sterty za pomocą -
Xms1g -Xmx2g
spróbujZapoznaj się z kilkoma powiązanymi pytaniami dotyczącymi G1GC
Śmieciarka Java 7 (JDK 7) i dokumentacja na G1
Śmieciarka Java G1 w produkcji
Artykuł Oracle dotyczący technologii sieciowej dostrajania GC
źródło
Po prostu zwiększ nieco rozmiar sterty, ustawiając tę opcję w
Uruchom → Uruchom konfiguracje → Argumenty → Argumenty VM
Xms - dla minimalnego limitu
Xmx - dla maksymalnego limitu
źródło
arguments
karty ... co powinniśmy zrobić, aby to osiągnąć?Dla mnie zadziałały następujące kroki:
eclipse.ini
plikZmiana
do
Uruchom ponownie Eclipse
Spójrz tutaj
źródło
Spróbuj tego
otwórz
build.gradle
plikźródło
Poniższe działało dla mnie. Po prostu dodaj następujący fragment kodu:
źródło
zwiększ javaMaxHeapsize w pliku build.gradle (moduł: aplikacja)
do (Dodaj tę linię w gradiencie)
źródło
Opisy rozmiarów sterty Java (xms, xmx, xmn)
Ustawia początkowy rozmiar sterty Java. Domyślny rozmiar to 2097152 (2 MB). Wartości muszą być wielokrotnością 1024 bajtów (1 KB) i być większe. (Flaga -server zwiększa domyślny rozmiar do 32 M.)
Ustawia początkowy rozmiar sterty Java dla generacji Eden. Wartość domyślna to 640 KB. (Flaga -server zwiększa domyślny rozmiar do 2M).
Ustawia maksymalny rozmiar, do którego może wzrosnąć sterta Java. Domyślny rozmiar to 64 M. (Flaga -server zwiększa domyślny rozmiar do 128M.) Maksymalny limit sterty wynosi około 2 GB (2048 MB).
Formatowanie argumentów pamięci Java (xms, xmx, xmn)
Podczas ustawiania wielkości sterty Java należy podać argument pamięci, używając jednej z liter „m” lub „M” dla MB, lub „g” lub „G” dla GB. Twoje ustawienie nie będzie działać, jeśli podasz „MB” lub „GB”. Prawidłowe argumenty wyglądają tak:
-Xms64m lub -Xms64M -Xmx1g lub -Xmx1G Można również użyć 2048 MB, aby określić 2 GB Ponadto, należy podać liczby całkowite przy podawaniu argumentów. Użycie -Xmx512m jest prawidłową opcją, ale -Xmx0,5g spowoduje błąd.
To odniesienie może być pomocne dla kogoś.
źródło
Możesz także zwiększyć przydział pamięci i rozmiar sterty, dodając to do
gradle.properties
pliku:org.gradle.jvmargs=-Xmx2048M -XX\:MaxHeapSize\=32g
Nie musi to być 2048M i 32g, więc zmień go tak, jak chcesz.
źródło
Rozwiązany:
Wystarczy dodać
org.gradle.jvmargs=-Xmx1024m
w
gradle.properties
a jeśli nie istnieje, utwórz go.
źródło
Pracuję w Android Studio i napotkałem ten błąd podczas próby wygenerowania podpisanego pakietu APK do wydania. Byłem w stanie zbudować i przetestować APK debugowania bez problemu, ale jak tylko chciałem zbudować APK wersji, proces kompilacji będzie działał przez kilka minut, a następnie w końcu zakończy się komunikatem „Błąd java.lang.OutOfMemoryError: GC przekroczony limit napowietrzny ". Zwiększyłem rozmiary sterty zarówno dla maszyny wirtualnej, jak i kompilatora Android DEX, ale problem nadal występował. W końcu po wielu godzinach i kubkach kawy okazało się, że problem występuje w moim pliku „build.gradle” na poziomie aplikacji - miałem parametr „minifyEnabled” dla typu kompilacji wydania ustawiony na „false”, w konsekwencji uruchamiając rzeczy Proguard na temat kodu, który nie przeszedł procesu zmniejszania kodu (patrz https://developer.android.). Zmieniłem parametr „minifyEnabled” na „true”, a kompilacja wydania została wykonana jak sen :)
Krótko mówiąc, musiałem zmienić plik „build.gradle” na poziomie aplikacji z: // ...
do
źródło
Aby zwiększyć rozmiar sterty w IntelliJ IDEA, postępuj zgodnie z następującymi instrukcjami. To zadziałało dla mnie.
Dla użytkowników systemu Windows
Przejdź do lokalizacji, w której jest zainstalowane IDE i wyszukaj następujące.
Edytuj plik i dodaj następujące elementy.
To jest to !!
źródło
możesz spróbować wprowadzić zmiany w ustawieniach serwera, odwołując się do tego obrazu i zwiększyć rozmiar pamięci do przetwarzania zmian procesu podświetlonych na żółto
możesz także wprowadzić zmiany w stosie Java, otwierając cmd->
set _java_opts -Xmx2g
2g (2 gigabajty) w zależności od złożoności programu
spróbuj użyć mniej stałych zmiennych i zmiennych temp
źródło
Musisz zwiększyć rozmiar pamięci w Jdeveloper, przejdź do setDomainEnv.cmd .
i
źródło
W Netbeans pomocne może być zaprojektowanie maksymalnego rozmiaru sterty. Idź do Uruchom => Ustaw konfigurację projektu => Dostosuj . W oknie Uruchom wyskakującego okna przejdź do opcji VM , wypełnij
-Xms2048m -Xmx2048m
. Może rozwiązać problem z wielkością sterty.źródło
Ponowne uruchomienie mojego MacBooka rozwiązało ten problem.
źródło
Nie wiem, czy to nadal jest istotne, czy nie, ale chcę tylko podzielić się tym, co dla mnie zadziałało.
Zaktualizuj wersję kotlin do najnowszej dostępnej. https://blog.jetbrains.com/kotlin/category/releases/
i gotowe.
źródło