Plik JAR Androida Studio Google powodujący błąd narzutu GC przekroczył błąd


210

Korzystam z systemu Android Studio w systemie OS X. Otrzymuję ten komunikat o błędzie:

BŁĄD: kompilacja nie powiodła się z wyjątkiem.

  • Co poszło źle: wykonanie nie powiodło się dla zadania „: app: preDexDebug”. com.android.ide.common.internal.LoggedErrorException: Nie można uruchomić polecenia: / Applications / Android Studio.app/sdk/build-tools/android-4.4W/dx --dex --output / Users / alex / AndroidStudioProjects / SilentSMS / app / build / intermediates / pre-dexed / debug / android-4.3_r2.1-f22bbff4d1017230e169a4844a9c2195f13060d2.jar /Users/alex/AndroidStudioProjects/SilentSMS/app/libs/android-4.3_r2.1.jar

    Kod błędu: 3 wyjście:

  UNEXPECTED TOP-LEVEL ERROR:
  java.lang.OutOfMemoryError: GC overhead limit exceeded
      at com.android.dx.cf.code.RopperMachine.getSources(RopperMachine.java:665)
      at com.android.dx.cf.code.RopperMachine.run(RopperMachine.java:288)
      at com.android.dx.cf.code.Simulator$SimVisitor.visitLocal(Simulator.java:612)
      at com.android.dx.cf.code.BytecodeArray.parseInstruction(BytecodeArray.java:412)
      at com.android.dx.cf.code.Simulator.simulate(Simulator.java:94)
      at com.android.dx.cf.code.Ropper.processBlock(Ropper.java:782)
      at com.android.dx.cf.code.Ropper.doit(Ropper.java:737)
      at com.android.dx.cf.code.Ropper.convert(Ropper.java:346)
      at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:282)
      at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:139)
      at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:94)
      at com.android.dx.command.dexer.Main.processClass(Main.java:682)
      at com.android.dx.command.dexer.Main.processFileBytes(Main.java:634)
      at com.android.dx.command.dexer.Main.access$600(Main.java:78)
      at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:572)
      at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
      at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
      at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
      at com.android.dx.command.dexer.Main.processOne(Main.java:596)
      at com.android.dx.command.dexer.Main.processAllFiles(Main.java:498)
      at com.android.dx.command.dexer.Main.runMonoDex(Main.java:264)
      at com.android.dx.command.dexer.Main.run(Main.java:230)
      at com.android.dx.command.dexer.Main.main(Main.java:199)
      at com.android.dx.command.Main.main(Main.java:103)

Korzystam z tej biblioteki:

http://grepcode.com/snapshot/repository.grepcode.com/java/ext/com.google.android/android/4.3_r2.1/

Wyciągnąłem plik JAR i dodałem go do mojego projektu - projekt, który próbuję zbudować, to:

https://github.com/domi007/silentSMS/

Rozumiem, że to dlatego, że moje wartości xms i xmx są zbyt niskie. Zwiększyłem je w:

/ Applications / Android Studio.app/bin/idea.vmoptions, dzięki czemu teraz mówi:

-Xms256m
-Xmx1024m

Jednak nadal pojawia się błąd. Co może to być spowodowane? Poza tym, że aplikacja silentSMS jest projektem Eclipse, a ja przenosiłem kod do Android Studio, nic nie zmieniłem. Jeśli chodzi o błędy wykrywania w Android Studio - nie ma, a wszystko inne wygląda dobrze.

Odpowiedzi:


547

Myślę, że istnieje osobny sposób na podniesienie limitu stosu operacji dexing. Dodaj to do swojego androidzamknięcia w swoim build.gradlepliku:

dexOptions {
    javaMaxHeapSize "4g"
}

i zobacz, czy to pomoże.

(pomysł dzięki uprzejmości Scott Barta )


45
4gjest trochę przesada, 2gjest ok
Hugo Gresse

3
Fantastyczny! To również naprawiło mój błąd. Uważam, że im więcej pamięci daję, tym szybsza jest kompilacja. Poszedłem z ponad 1 minuty do 19 sekund.
Simon

2
Nadal pojawia
IgorGanapolsky 17.08.16

7
Dodałem to, ale nadal widzęOutOfMemoryError
Chad Bingham,

8
nie działało dla mnie, musiałem przejść do gradle.properties:org.gradle.jvmargs=-XX:MaxPermSize=1024m -Xms1024m -Xmx4096m -XX:ReservedCodeCacheSize=1024m
hmac

93

W moim przypadku zwiększenie wielkości sterty wygląda następująco:

Korzystanie z Androida Studio 1.1.0

android {
    dexOptions {
        incremental true
        javaMaxHeapSize "2048M"
    }
}

Umieść powyższy kod w pliku Build.gradle .


4
działało to do pokonania GC overhead limit exceededpo tym, jak włączyłem Multidexing. Wyjątek byłat com.android.dx.command.dexer.Main.runMultiDex(Main.java:334)
Ktoś gdzieś

to nie będzie ładne jako komentarz, ale błąd Android Studio pokazał „BŁĄD NAJWYŻSZYM POZIOMIE: java.lang.OutOfMemoryError: Przekroczono limit narzutu GC” Lokalizacja wyjątku była na at com.android.dx.util.FixedSizeList.<init>(FixedSizeList.java:38)górze, a na szczycie stosu byłocom.android.dx.command.dexer.Main.runMultiDex(Main.java:334) at com.android.dx.command.dexer.Main.run(Main.java:244) at com.android.dx.command.dexer.Main.main(Main.java:215) at com.android.dx.command.Main.main(Main.java:106)
ktoś gdzieś

1
Ale gdy tylko dodałem, zasugerowałem javaMaxHeapSize i parametry przyrostowe, Android Studio było w stanie zbudować aplikację z wieloma wersjami.
Ktoś gdzieś

jeśli 2 GB nie wystarcza w pewnym momencie, spróbuję 4 GB sugerowanego oprogramowania.
Ktoś gdzieś

1
Dzięki. Zwróć uwagę na to, co mówią dokumenty incremental: ma to wiele ograniczeń i może nie działać. Używaj ostrożnie.
Ferran Maylinch,

41

Ten nowy problem jest spowodowany najnowszą wersją Androida.

Przejdź do folderu głównego projektu, otwórz gradle.propertiesi dodaj następujące opcje:

org.gradle.daemon=true

org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

org.gradle.parallel=true

org.gradle.configureondemand=true

Następnie dodaj te zmiany do swojego build.gradlepliku:

dexOptions {
        incremental = true
        preDexLibraries = false
        javaMaxHeapSize "4g" // 2g should be also OK
}

1
Ostrzeżenie: android.dexOptions.incrementalWłaściwość jest przestarzała i nie ma wpływu na proces kompilacji.
tir38

to rozwiązało mój problem. ale i; ts tworzy plik o nazwie java_pid1512.hprof, który jest bardzo duży. Zgaduję, że twoja opcja Dfile ją tworzy? czy jest to konieczne i czy możesz pokazać, jak usunąć zrzut do pliku
j2emanue

1
@ j2emanue: Ten plik został utworzony z powodu opcji „HeapDumpOnOutOfMemoryError”: docs.oracle.com/cd/E15289_01/doc.40/e15062/…
Mehlyfication

1
Może wymagać aktualizacji: incrementalzostał usunięty pod koniec 2018 r.
cuasodayleo

w AS 3.4 włączenie „org.gradle.jvmargs = -Xmx2048m -XX: MaxPermSize = 512m -XX: + HeapDumpOnOutOfMemoryError -Dfile.encoding = UTF-8” w pliku gradle.properties rozwiązało problem dla mnie
JimmyFlash

4

Wyłączam mój Instant Run przez:

Preferencje menu → KompilacjaNatychmiastowe uruchamianie „Włącz natychmiastowe uruchamianie do kodu wymiany”

Wydaje mi się, że to Instant Run spowalnia kompilację i tworzy plik pidXXX.hprof o dużym rozmiarze, co powoduje przekroczenie limitu narzutu gogle AndroidStudio.

(Mój zestaw SDK urządzenia to 19.)


Jak się dowiedziałeś, że to Instant Run stworzył tak duży plik hprof? Zauważyłem jeden utworzony niedawno na naszym serwerze GitLab, ale nie mamy włączonego natychmiastowego uruchamiania.
AdamMc331

4

Android Studio 3.5.3

Znajdź Ustawienia pamięci (Cmd + Shift + A na Macu lub kliknij Pomoc i zacznij pisać „Ustawienia pamięci”) w Preferencjach / Ustawieniach i zwiększ rozmiar stosu IDE i / lub Rozmiar stosu demona według własnego uznania wprowadź opis zdjęcia tutaj


1
Dzięki, uratowałeś mi dzień.
Virendra Pal Singh


0

Wymusiłem zamknięcie całego Java.exe z taskmanger, zrestartowałem Android Studio i to zadziałało dla mnie

wprowadź opis zdjęcia tutaj


0

Dla mnie żadna z odpowiedzi nie zadziałała. Domyślałem się, że bardzo ciężka praca procesora powoduje, że komputer jest gorący. Po zamknięciu programów zużywających duże ilości procesora (np. Chrome) i ochłodzeniu laptopa problem zniknął.

Dla porównania: miałem procesor na poziomie 96% -97%, a użycie pamięci ponad 2 000 000 KB przez proces java.exe (który w rzeczywistości był procesem związanym z gradem).


Jak twoje rozwiązanie odnosi się do postawionego tutaj SZCZEGÓLNEGO problemu?
kalabalik

Otrzymuję ten sam błąd, co określony powyżej: java.lang.OutOfMemoryError: Przekroczono limit kosztów ogólnych GC Rozwiązanie, które zaoferowałem, rozwiązało dla mnie ten błąd
olNoy

0

Używam Android Studio 3.4i jedyną rzeczą, która działała dla mnie, było usunięcie następujących wierszy z mojego build.gradlepliku:

minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

Ponieważ Android Studio 3.4używa R8się full modei nie jest kompatybilny z bezpośrednimProguard


2
Myślę, że to nie jest rozwiązanie, gdy musisz wydać zaciemnioną wersję. Użyłem grad-5.2.1 z Android Studio 3.4 i działa dobrze nawet z minifyEnabled truekonfiguracją pro-guard, podczas gdy grad-5.1.1 miał podobne problemy.
Vikas Patidar

Jest to dokładne przeciwieństwo tego, czego chcemy. -1
Zun

Tak jak powiedziałem, zadziałało to dla mnie, błąd zniknął i wreszcie udało mi się wygenerować apk. Żadna z pozostałych odpowiedzi nie zadziałała w moim projekcie.
pableiros

zaktualizuj gradację do wersji 5.2.1 uruchom cammand w / project / android ./gradlew wrapper --gradle-version=5.2.1
Ashok Devatwal

0

w moim przypadku edytuję swoje gradle.properties:

Uwaga: jeśli włączysz minifyEnabled true:

usuń ten wiersz:

android.enableR8=true

i dodaj te wiersze w ur build.gradle, androidblok:

  dexOptions {
        incremental = true
        preDexLibraries = false
        javaMaxHeapSize "4g" // 2g should be also OK
    }

mam nadzieję, że to pomoże komuś :)


0

4g to trochę przesada, jeśli nie chcesz zmieniać buildGradle, możesz użyć PLIK -> Nieprawidłowe bufory / restart.

To działa dobrze dla mnie ...


0

W pewnym momencie apply plugin: 'com.android.application'do mojej klasy kompilacji dodano duplikat kopii . Usunięcie duplikatu kopii i upewnienie się, że wszystkie moje wtyczki aplikacyjne były na górze, rozwiązało problem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.