Fichier JAR Android Studio Google provoquant une erreur de dépassement de la limite de surcharge du GC

210

J'utilise Android Studio sur OS X. Je reçois ce message d'erreur:

ÉCHEC: la construction a échoué avec une exception.

  • Problème: l'exécution a échoué pour la tâche ': app: preDexDebug'. com.android.ide.common.internal.LoggedErrorException: échec de l'exécution de la commande: / 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

    Code d'erreur: 3 Sortie:

  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)

J'utilise cette bibliothèque:

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

J'ai tiré le fichier JAR et l'ai ajouté à mon projet - le projet que j'essaye de construire est:

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

Je comprends que c'est parce que mes valeurs xms et xmx sont trop faibles. Je les ai augmentés en:

/ Applications / Android Studio.app/bin/idea.vmoptions pour qu'il indique maintenant:

-Xms256m
-Xmx1024m

Cependant, je reçois toujours l'erreur. Par quoi cela pourrait-il être causé? À part que l'app silentSMS est un projet Eclipse et que je porte le code sur Android Studio, je n'ai rien changé. En termes d'erreurs de repérage d'Android Studio - ce n'est pas le cas, et tout le reste semble bien.

amlwwalker
la source

Réponses:

547

Je pense qu'il existe un moyen distinct d'augmenter la limite de tas de l'opération de dexing. Ajoutez ceci à votre androidfermeture dans votre build.gradledossier:

dexOptions {
    javaMaxHeapSize "4g"
}

et voyez si cela aide.

(idée gracieuseté de cette réponse de Scott Barta )

CommonsWare
la source
45
4gest un peu exagéré, ça 2gva
Hugo Gresse
3
Fantastique! Cela a également corrigé mon erreur. Je trouve que plus je lui donne de mémoire, plus la construction avance vite. Je suis passé de plus d'une minute à 19 secondes.
Simon
2
J'obtiens
IgorGanapolsky
7
J'ai ajouté cela, mais je vois toujoursOutOfMemoryError
Chad Bingham
8
n'a pas fonctionné pour moi, devait monter dans gradle.properties:org.gradle.jvmargs=-XX:MaxPermSize=1024m -Xms1024m -Xmx4096m -XX:ReservedCodeCacheSize=1024m
hmac
93

Dans mon cas, pour augmenter la taille du tas, cela ressemble à ceci:

Utilisation d'Android Studio 1.1.0

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

Mettez le code ci-dessus dans votre fichier Build.gradle .

Dhruv Raval
la source
4
cela a fonctionné pour surmonter GC overhead limit exceededaprès avoir activé Multidexing. L'exception était dansat com.android.dx.command.dexer.Main.runMultiDex(Main.java:334)
Someone Somewhere
cela ne va pas être joli comme un commentaire, mais l'erreur Android Studio a montré `ERREUR DE NIVEAU SUPÉRIEUR INATTENDU: java.lang.OutOfMemoryError: limite de surcharge GC dépassée` L'emplacement de l'exception était à at com.android.dx.util.FixedSizeList.<init>(FixedSizeList.java:38)et le sommet de la pile étaitcom.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)
Quelqu'un Quelque Part
1
Mais dès que j'ai ajouté que vous avez suggéré javaMaxHeapSize et des paramètres incrémentiels, Android Studio a pu créer l'application multi-dexée.
Someone Somewhere
si 2 Go ne suffisent pas à un moment donné, j'essaierai 4 Go que le commonware a suggéré.
Someone Somewhere
1
Merci. Notez ce que disent les documents incremental: cela a de nombreuses limites et peut ne pas fonctionner. Utilisez avec précaution.
Ferran Maylinch du
41

Ce nouveau problème est dû à la dernière version d'Android.

Accédez au dossier racine de votre projet, ouvrez gradle.properties-le et ajoutez les options suivantes:

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

Ajoutez ensuite ces modifications dans votre build.gradlefichier:

dexOptions {
        incremental = true
        preDexLibraries = false
        javaMaxHeapSize "4g" // 2g should be also OK
}
gourous
la source
1
Avertissement: la android.dexOptions.incrementalpropriété est obsolète et n'a aucun effet sur le processus de génération.
tir38
cela a résolu mon problème. mais je crée un fichier appelé java_pid1512.hprof qui est très volumineux. je suppose que votre option Dfile le crée? est-il nécessaire et pouvez-vous montrer comment supprimer le vidage dans un fichier
j2emanue
1
@ j2emanue: Ce fichier est créé en raison de l'option "HeapDumpOnOutOfMemoryError": docs.oracle.com/cd/E15289_01/doc.40/e15062/…
Mehlyfication
1
Peut avoir besoin d'être mis à jour: incrementalest supprimé fin 2018
cuasodayleo
dans AS 3.4 activant "org.gradle.jvmargs = -Xmx2048m -XX: MaxPermSize = 512m -XX: + HeapDumpOnOutOfMemoryError -Dfile.encoding = UTF-8" dans le fichier gradle.properties a résolu le problème pour moi
JimmyFlash
4

Je désactive mon exécution instantanée par:

Préférence de menu → BuildInstant Run "Activer Instant Run pour le code de remplacement à chaud"

Je suppose que c'est l'exécution instantanée qui rend la construction lente et crée un fichier pidXXX.hprof de grande taille qui provoque le dépassement de la limite de surcharge d'AndroidStudio gc.

(Le SDK de mon appareil est 19.)

崔 乐天
la source
Comment avez-vous découvert que c'est Instant Run qui a créé un si gros fichier hprof? J'ai remarqué un créé récemment sur notre serveur GitLab, mais nous n'avons pas activé l'exécution instantanée.
AdamMc331
4

Android Studio 3.5.3

Trouvez les paramètres de mémoire (Cmd + Shift + A sur Mac ou cliquez sur Aide et commencez à taper "Paramètres de mémoire") sous Préférences / Paramètres et augmentez la taille de tas IDE et / ou la taille de tas de démon à votre satisfaction entrez la description de l'image ici

Ericn
la source
1
Merci d'avoir sauvé ma journée.
Virendra Pal Singh
1

Ajoutez ceci au fichier build.gradle

dexOptions {
   javaMaxHeapSize "2g"
}
Ghulam Rasool
la source
0

J'ai forcé la fermeture de tous les fichiers Java.exe du gestionnaire de tâches, redémarré Android Studio et cela a fonctionné pour moi

entrez la description de l'image ici

Hitesh Sahu
la source
0

Pour moi, aucune des réponses n'a fonctionné que j'ai vu ici. J'ai deviné que le fait de faire travailler le processeur extrêmement dur rend l'ordinateur chaud. Après avoir fermé les programmes qui consomment de grandes quantités de CPU (comme le chrome) et refroidir mon ordinateur portable, le problème a disparu.

Pour référence: j'avais le CPU sur 96% -97% et l'utilisation de la mémoire de plus de 2 000 000 K par un processus java.exe (qui était en fait un processus lié à gradle).

olNoy
la source
Comment votre solution est-elle liée au problème SPÉCIFIQUE posé ici?
kalabalik
J'obtiens la même erreur spécifiée ci-dessus: java.lang.OutOfMemoryError: la limite de surcharge du GC a été dépassée La solution que j'ai proposée a résolu cette erreur pour moi
olNoy
0

J'utilise Android Studio 3.4et la seule chose qui a fonctionné pour moi a été de supprimer les lignes suivantes de mon build.gradlefichier:

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

Parce qu'il Android Studio 3.4utilise R8dans full modeet n'est pas directement compatible avecProguard

pableiros
la source
2
Je pense que ce n'est pas une solution lorsque vous devez publier une version obscurcie. J'ai utilisé gradle-5.2.1 avec Android Studio 3.4 et cela fonctionne bien même avec la minifyEnabled trueconfiguration avec pro-guard alors que gradle-5.1.1 avait des problèmes similaires.
Vikas Patidar
C'est exactement le contraire de ce que nous voulons. -1
Zun
Comme je l'ai dit, cela a fonctionné pour moi et l'erreur a disparu et j'ai finalement pu générer l'apk. Aucune des autres réponses n'a fonctionné dans mon projet.
pableiros
mise à jour de gradle vers 5.2.1 exécutez cammand dans / projet / android ./gradlew wrapper --gradle-version=5.2.1
Ashok Devatwal
0

dans mon cas, je modifie mon gradle.properties:

note: si vous activez minifyEnabled true:

supprimer cette ligne:

android.enableR8=true

et ajoutez ces lignes dans ur build.gradle, androidblock:

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

j'espère que cela aide quelqu'un :)

sana ebadi
la source
0

4g est un peu exagéré, si vous ne voulez pas changer buildGradle, vous pouvez utiliser FILE -> Caches / restart invalides.

Ça marche bien pour moi ...

Pabel
la source
0

À un moment donné, une copie en double de a apply plugin: 'com.android.application'été ajoutée à ma version de build. Supprimer la copie en double et m'assurer que tous mes plugins d'application étaient au sommet a résolu le problème pour moi.

mburst
la source