14

I recently upgraded from Android Studio 0.9.2 to 1.0 (including version 1.0.0 of the Gradle plugin) and I'm having an issue with building my project.

Whenever I build I get the following exception at the dexDebug or dexRelease step:

UNEXPECTED TOP-LEVEL ERROR:
    java.lang.OutOfMemoryError: GC overhead limit exceeded
        at java.util.HashMap.createEntry(HashMap.java:897)
        at java.util.HashMap.addEntry(HashMap.java:884)
        at java.util.HashMap.put(HashMap.java:505)
        at com.android.dx.rop.type.Type.putIntern(Type.java:857)
        at com.android.dx.rop.type.Type.intern(Type.java:365)
        at com.android.dx.rop.type.Type.internClassName(Type.java:415)
        at com.android.dx.cf.cst.ConstantPoolParser.parse0(ConstantPoolParser.java:289)
        at com.android.dx.cf.cst.ConstantPoolParser.parse0(ConstantPoolParser.java:299)
        at com.android.dx.cf.cst.ConstantPoolParser.parse(ConstantPoolParser.java:150)
        at com.android.dx.cf.cst.ConstantPoolParser.parseIfNecessary(ConstantPoolParser.java:124)
        at com.android.dx.cf.cst.ConstantPoolParser.getPool(ConstantPoolParser.java:115)
        at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:482)
        at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
        at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
        at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
        at com.android.dx.command.dexer.Main.processClass(Main.java:704)
        at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673)
        at com.android.dx.command.dexer.Main.access$300(Main.java:82)
        at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602)
        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:632)
        at com.android.dx.command.dexer.Main.processAllFiles(Main.java:505)
        at com.android.dx.command.dexer.Main.runMultiDex(Main.java:332)
        at com.android.dx.command.dexer.Main.run(Main.java:243)
        at com.android.dx.command.dexer.Main.main(Main.java:214)
        at com.android.dx.command.Main.main(Main.java:106)

I tried increasing the heap size of Android Studio to -Xmx4096m but to no avail. In Android Studio 0.9.2 with version 0.14 of the gradle plugin building worked fine.

This is the build.gradle file of my project:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
    }
}

And this is the build.gradle file of my module:

apply plugin: 'android'

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.android.support:appcompat-v7:21.+'
    compile 'com.android.support:cardview-v7:21.0.+'
    compile 'com.android.support:recyclerview-v7:21.0.+'
    compile 'com.android.support:multidex:1.+'
    compile 'com.google.android.gms:play-services:6.5.+'
    compile 'org.jsoup:jsoup:1.8.+'
    compile 'commons-io:commons-io:2.4'
    compile 'org.apache.commons:commons-lang3:3.3.2'
    compile 'com.rometools:rome:1.5.0'
    compile 'com.google.apis:google-api-services-blogger:v3-rev44-1.19.0'
    compile 'com.google.http-client:google-http-client-gson:1.19.0'
    compile 'org.apache.commons:commons-collections4:4.0'
    compile 'com.parse.bolts:bolts-android:1.1.2'
    compile files('libs/android-query.0.26.8.jar')
    compile files('libs/Parse-1.7.1.jar')
}

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"
    defaultConfig {
        // Enabling multidex support.
        multiDexEnabled true
        minSdkVersion 10
        targetSdkVersion 21
        versionCode 1040009
        versionName "1.4"

    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-dcrapp.txt'
            shrinkResources true
        }

        debug {
            minifyEnabled false
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-dcrapp.txt'
        }
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }


        //Bugfix for Gradle build bug
        packagingOptions {
            exclude 'META-INF/LICENSE.txt'
            exclude 'META-INF/NOTICE.txt'
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}

task copyMappingFiles(type: Copy)

copyMappingFiles {
    from 'build\\outputs\\mapping\\release'
    into 'mappings\\'+android.defaultConfig.versionCode
    include('mapping.txt')
}

assembleRelease.finalizedBy copyProguardFiles

What could be the cause of this issue and how can it be solved?

Leon Lucardie
  • 9,541
  • 4
  • 50
  • 70

2 Answers2

29

Looks like Android Studio ran out of memory, try increasing the memory size in AndroidStudio.app/Contents/bin/studio.vmoptions

-Xms256m
-Xmx1024m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=96m
-XX:+UseCompressedOops

as per suggested from answers in Android Studio - How to increase Allocated Heap Size

Additionally you may want to add

dexOptions {
    javaMaxHeapSize "4g"
}

to your module build.gradle as per Android Studio Google JAR file causing GC overhead limit exceeded error

Community
  • 1
  • 1
kandroidj
  • 13,784
  • 5
  • 64
  • 76
  • 3
    OR the gradle daemon ran out of memory. Check Task Manager who eats the most memory. – Eugen Pechanec Dec 08 '14 at 21:24
  • 2
    Already tried the first option. The second option (dexOptions.javaMaxHeapSize) did solve the issue. Seems it was the gradle deamon running out of memory. Thank you very much! Now I'm wondering why it happens in the first place. Except for the gradle plugin version I didn't change anything in the project itself. Does the new gradle version just use more memory? – Leon Lucardie Dec 08 '14 at 21:32
  • 1
    Its very possible that it does, i would read the documentation and release notes for this version of gradle @ http://www.gradle.org/documentation – kandroidj Dec 08 '14 at 21:37
21

Looks like dexing runs out of memory. Try:

android {
    dexOptions {
        javaMaxHeapSize "2048M"
    }
}

For additional options, see dex options in the Gradle Plugin User Guide.

Peter Niederwieser
  • 121,412
  • 21
  • 324
  • 259