Se ha superado el límite máximo de GC overhead después de agregar una dependencia

De forma similar a esta pregunta , recibí el siguiente error:

[INFO] --- android-maven-plugin:3.3.0:dex (default-dex) @ betodef-android --- [INFO] /usr/lib/jvm/java-6-sun-1.6.0.32/jre/bin/java [-Xmx1024M, {snip} [INFO] [INFO] UNEXPECTED TOP-LEVEL ERROR: [INFO] java.lang.OutOfMemoryError: GC overhead limit exceeded 

Esto ocurrió después de agregar varias dependencias, incluyendo fastutil , a mi proyecto de Android. Sin embargo, aumentar la memoria disponible para dex no soluciona el problema.

El problema radica en un límite del formato dex , específicamente el límite 65536 en el número de referencias de método .

Para diagnosticar el problema, aumente la memoria a una cantidad mucho mayor (la habilitación de depuración / salida detallada no ayuda, curiosamente). En mi caso, he añadido lo siguiente a la configuración de android-maven-plugin :

 <dex> <jvmArguments> <jvmArgument>-Xmx4096M</jvmArgument> </jvmArguments> </dex> 

Después de elegir un tamaño de montón grande, el mensaje cambia para incluir algo como esto:

 [INFO] trouble writing output: Too many methods: 172296; max is 65536. By package: [INFO] 20 android.app [INFO] 18 android.content [INFO] 1 android.content.pm [INFO] 7 android.content.res [INFO] 7 android.hardware [INFO] 38 android.media [INFO] 20 android.opengl [INFO] 11 android.os [INFO] 1 android.text.method [INFO] 8 android.util [INFO] 38 android.view [INFO] 2 android.view.inputmethod [INFO] 21 android.widget ... [INFO] 3 com.google.common.annotations [INFO] 746 com.google.common.base [INFO] 9 com.google.common.base.internal [INFO] 833 com.google.common.cache [INFO] 8478 com.google.common.collect [INFO] 50 com.google.common.eventbus [INFO] 385 com.google.common.hash [INFO] 597 com.google.common.io [INFO] 92 com.google.common.math [INFO] 134 com.google.common.net [INFO] 521 com.google.common.primitives [INFO] 404 com.google.common.reflect [INFO] 954 com.google.common.util.concurrent [INFO] 16 default [INFO] 227 it.unimi.dsi.fastutil [INFO] 1370 it.unimi.dsi.fastutil.booleans [INFO] 17249 it.unimi.dsi.fastutil.bytes [INFO] 17249 it.unimi.dsi.fastutil.chars [INFO] 17279 it.unimi.dsi.fastutil.doubles [INFO] 17263 it.unimi.dsi.fastutil.floats [INFO] 17309 it.unimi.dsi.fastutil.ints [INFO] 628 it.unimi.dsi.fastutil.io [INFO] 17315 it.unimi.dsi.fastutil.longs [INFO] 26514 it.unimi.dsi.fastutil.objects [INFO] 17257 it.unimi.dsi.fastutil.shorts [INFO] 2 java.awt [INFO] 5 java.awt.datatransfer [INFO] 206 java.io [INFO] 346 java.lang [INFO] 10 java.lang.ref [INFO] 71 java.lang.reflect [INFO] 27 java.math [INFO] 26 java.net [INFO] 108 java.nio [INFO] 6 java.nio.channels [INFO] 2 java.nio.charset [INFO] 13 java.security [INFO] 2 java.text [INFO] 382 java.util [INFO] 128 java.util.concurrent [INFO] 33 java.util.concurrent.atomic [INFO] 40 java.util.concurrent.locks [INFO] 6 java.util.jar [INFO] 6 java.util.logging [INFO] 10 java.util.regex [INFO] 20 java.util.zip [INFO] 26 javax.microedition.khronos.egl [INFO] 188 javax.microedition.khronos.opengles [INFO] 7 sun.misc 

Como puede ver, hay una gran cantidad de referencias en las clases fastutil .

Hay dos soluciones posibles de este problema:

  1. Utilice una alternativa a la dependencia problemática (duh).
  2. Utilice un optimizador como Proguard ( general Android , específico de Maven ).
  • ClassNotFoundException pero puedo encontrar esta clase en classes.dex
  • La biblioteca de terceros se agrega bajo el directorio dexedLib, pero la biblioteca no tiene classes.dex
  • No se puede ejecutar dex: varios archivos dex definen Lcom / myapp / R $ array;
  • ¿Dex y Dalvik soportan la compatibilidad binaria de Java?
  • ¿Qué es dex en Gradle?
  • Acelerar el tiempo de construcción del proyecto Android en IntelliJ IDEA
  • No se puede ejecutar dex: Múltiples archivos dex definen Landroid / support / v7 / util / ThreadUtil $ MainThreadCallback;
  • ¿Qué son los archivos .dex en Android?
  • Android Studios RuntimeException: Excepción inesperada en el hilo del escritor de dex
  • Mockito en el emulador de Android
  • DexIndexOverflowException: No se puede combinar el nuevo índice 65772 en una instrucción no jumbo !: Jumbo Mode? Y / o Multi-Dex? ¿Qué hay detrás de la escena?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.