El archivo JAR de Google de Android Studio provoca un error de límite superior de GC

210

Estoy usando Android Studio en OS X. Recibo este mensaje de error:

FALLO: Falló la compilación con una excepción.

  • Qué salió mal: la ejecución falló para la tarea ': aplicación: preDexDebug'. com.android.ide.common.internal.LoggedErrorException: Error al ejecutar el comando: / 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.

    Código de error: 3 Salida:

  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)

Estoy usando esta biblioteca:

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

Saqué el archivo JAR y lo agregué a mi proyecto; el proyecto que estoy tratando de construir es:

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

Entiendo que es porque mis valores xms y xmx son demasiado bajos. Los aumenté en:

/ Aplicaciones / Android Studio.app/bin/idea.vmoptions para que ahora diga:

-Xms256m
-Xmx1024m

Sin embargo, todavía recibo el error. ¿Por qué podría ser esto causado? Aparte de que la aplicación silentSMS es un proyecto de Eclipse y que yo transfiero el código a Android Studio, no he cambiado nada. En términos de errores de detección de Android Studio, no lo hace, y todo lo demás se ve bien.

amlwwalker
fuente

Respuestas:

547

Creo que hay una forma separada de aumentar el límite de almacenamiento dinámico de la operación de desintoxicación. Agregue esto a su androidcierre en su build.gradlearchivo:

dexOptions {
    javaMaxHeapSize "4g"
}

y ver si eso ayuda.

(idea cortesía de esta respuesta de Scott Barta )

CommonsWare
fuente
45
4ges un poco exagerado, 2gestá bien
Hugo Gresse
3
¡Fantástico! Esto también solucionó mi error. Me parece que cuanto más memoria le doy, más rápido se va la compilación. Pasé de más de 1 minuto a 19 segundos.
Simon
2
Todavía recibo el error: java.lang.OutOfMemoryError: el límite superior del GC excedió [org.gradle.api.internal.project.ant.AntLoggingAdapter] en java.util.BitSet.clone
IgorGanapolsky
77
He agregado esto, pero todavía veoOutOfMemoryError
Chad Bingham el
8
no funcionó para mí, necesitaba subir en gradle.properties:org.gradle.jvmargs=-XX:MaxPermSize=1024m -Xms1024m -Xmx4096m -XX:ReservedCodeCacheSize=1024m
hmac
93

En mi caso, para aumentar el tamaño del montón se ve así:

Usando Android Studio 1.1.0

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

Coloque el código anterior en su archivo Build.gradle .

Dhruv Raval
fuente
44
Esto funcionó para superar GC overhead limit exceededdespués de que habilité Multidexing. La excepción fue enat com.android.dx.command.dexer.Main.runMultiDex(Main.java:334)
Someone Somewhere
esto no va a ser bonito como un comentario, pero el error de Android Studio mostró `ERROR INESPERADO DE NIVEL SUPERIOR: java.lang.OutOfMemoryError: se excedió el límite superior de GC` La ubicación de la excepción estaba en at com.android.dx.util.FixedSizeList.<init>(FixedSizeList.java:38)y la parte superior de la pila eracom.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)
alguien en algún lugar
1
Pero tan pronto como agregué, sugirió javaMaxHeapSize y parámetros incrementales, Android Studio pudo construir la aplicación multi-dexed.
Alguien en algún lugar
si 2 gb no es suficiente en algún momento, entonces intentaré 4 gb que sugirió el software común.
Alguien en algún lugar
1
Gracias. Observe lo que dicen los documentos incremental: esto tiene muchas limitaciones y puede no funcionar. Usar con cuidado.
Ferran Maylinch
41

Este nuevo problema es causado por la última versión de Android.

Vaya a la carpeta raíz de su proyecto, abra gradle.propertiesy agregue las siguientes opciones:

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

Luego agregue estos cambios en su build.gradlearchivo:

dexOptions {
        incremental = true
        preDexLibraries = false
        javaMaxHeapSize "4g" // 2g should be also OK
}
gurusiv
fuente
1
Advertencia: la android.dexOptions.incrementalpropiedad está en desuso y no tiene ningún efecto en el proceso de compilación.
tir38
Esto resolvió mi problema. pero creo un archivo llamado java_pid1512.hprof que es muy grande. ¿Supongo que su opción Dfile lo está creando? es necesario y puede mostrar cómo eliminar el volcado al archivo
j2emanue
1
@ j2emanue: este archivo se creó debido a la opción "HeapDumpOnOutOfMemoryError": docs.oracle.com/cd/E15289_01/doc.40/e15062/…
Mehlyfication
1
Es posible que deba actualizarse: incrementalse elimina a fines de 2018
cuasodayleo
en AS 3.4, habilitar "org.gradle.jvmargs = -Xmx2048m -XX: MaxPermSize = 512m -XX: + HeapDumpOnOutOfMemoryError -Dfile.encoding = UTF-8" en el archivo gradle.properties me resolvió el problema
JimmyFlash
4

Desactivo mi ejecución instantánea al:

Preferencia de menú → GenerarEjecución instantánea "Habilitar ejecución instantánea en código de intercambio en caliente"

Supongo que es la ejecución instantánea lo que hace que la compilación sea lenta y crea un archivo pidXXX.hprof de gran tamaño que hace que se exceda el límite superior de AndroidStudio gc.

(El SDK de mi dispositivo es 19.)

崔 乐天
fuente
¿Cómo descubriste que fue Instant Run la que creó un archivo hprof tan grande? Noté uno creado recientemente en nuestro servidor GitLab, pero no tenemos habilitada la ejecución instantánea.
AdamMc331
4

Android Studio 3.5.3

Encuentre la configuración de memoria (Cmd + Shift + A en Mac o haga clic en Ayuda y comience a escribir "Configuración de memoria") en Preferencias / Configuración y aumente el tamaño del montón IDE y / o el tamaño del montón Daemon para su satisfacción ingrese la descripción de la imagen aquí

ericn
fuente
1
Gracias me salvaste el día.
Virendra Pal Singh
1

Agregue esto al archivo build.gradle

dexOptions {
   javaMaxHeapSize "2g"
}
Ghulam Rasool
fuente
0

Forcé a cerrar todos los Java.exe desde el administrador de tareas, reinicié Android Studio y funcionó para mí

ingrese la descripción de la imagen aquí

Hitesh Sahu
fuente
0

Para mí, ninguna de las respuestas funcionó que vi aquí funcionó. Supuse que hacer que la CPU trabaje extremadamente duro hace que la computadora se caliente. Después de cerrar los programas que consumen grandes cantidades de CPU (como Chrome) y enfriar mi computadora portátil, el problema desapareció.

Como referencia: tenía la CPU en 96% -97% y el uso de memoria sobre 2,000,000K por un proceso java.exe (que en realidad era un proceso relacionado con gradle).

olNoy
fuente
¿Cómo se relaciona su solución con el problema ESPECÍFICO que se plantea aquí?
kalabalik
Obtengo el mismo error especificado anteriormente: java.lang.OutOfMemoryError: se superó el límite superior de GC La solución que ofrecí resolvió este error por mí
olNoy
0

Estoy usando Android Studio 3.4y lo único que funcionó para mí fue eliminar las siguientes líneas de mi build.gradlearchivo:

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

Debido a que Android Studio 3.4está usando R8en full modey no es compatible con directaProguard

pableiros
fuente
2
Creo que esta no es una solución cuando tienes que lanzar una compilación ofuscada. He usado gradle-5.2.1 con Android Studio 3.4 y funciona bien incluso con la minifyEnabled trueconfiguración pro-guard mientras gradle-5.1.1 tenía problemas similares.
Vikas Patidar
Esto es exactamente lo contrario de lo que queremos. -1
Zun
Como dije, esto funcionó para mí y el error desapareció y finalmente pude generar el apk. Ninguna de las otras respuestas funcionó en mi proyecto.
pableiros
actualizar gradle a 5.2.1 ejecutar cammand en / project / android ./gradlew wrapper --gradle-version=5.2.1
Ashok Devatwal
0

en mi caso, edito mi gradle.properties:

nota: si habilita el minifyEnabled true:

eliminar esta línea:

android.enableR8=true

y agregue estas líneas en ur build.gradle, androidbloquee:

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

Espero que esto ayude a alguien :)

sana ebadi
fuente
0

4g es un poco exagerado, si no desea cambiar buildGradle puede usar ARCHIVO -> Cachés / reiniciar no válidos.

Eso funciona bien para mí ...

Pabel
fuente
0

En algún momento apply plugin: 'com.android.application'se agregó una copia duplicada de mi gradle de construcción. Quitar la copia duplicada y asegurarme de que todos mis complementos de aplicación estuvieran en la parte superior me solucionó el problema.

mburst
fuente