167

I just updated the Android Studio to 3.5 Beta 1 and I'm getting

Expiring Daemon because JVM heap space is exhausted

message while the build is running. Also, the build is taking more time to complete. Does anyone have any idea regarding this?

larsgrefer
  • 2,735
  • 19
  • 36
Rishabh Sagar
  • 3,877
  • 3
  • 15
  • 24
  • 2
    See here if that helps: https://stackoverflow.com/questions/47207126/gradle-build-of-android-app-in-vsts-failing-after-running-out-of-memory – Juraj Martinka May 12 '19 at 06:00
  • 2
    @JurajMartinka yes, you are right. it got fixed after increasing the **IDE max heap size**. So they introduce a new option called **Memory Settings** in the latest Android Studio 3.5. This is all done to fix memory leak in Android Studio. – Rishabh Sagar May 13 '19 at 05:21

7 Answers7

176

This can be fixed by increasing the configured max heap size for the project.

Through IDE:

Add the below lines into the gradle.properties file. Below memory size (1) can be configured based on the RAM availability

org.gradle.daemon=true
org.gradle.jvmargs=-Xmx2560m

Through GUI:

In the Settings, search for 'Memory Settings' and increase the IDE max heap size and Daemon max heap size as per the system RAM availability.

Memory Settings in Android Studio

(1)

$ man java
...
-Xmxsize
    Specifies the maximum size (in bytes) of the memory allocation pool in bytes. This value
    must be a multiple of 1024 and greater than 2 MB. Append the letter k or K to indicate
    kilobytes, m or M to indicate megabytes, g or G to indicate gigabytes. The default value
    is chosen at runtime based on system configuration. For server deployments, -Xms and
    -Xmx are often set to the same value. See the section "Ergonomics" in Java SE HotSpot
    Virtual Machine Garbage Collection Tuning Guide at
    http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/index.html.

    The following examples show how to set the maximum allowed size of allocated memory to
    80 MB using various units:

        -Xmx83886080
        -Xmx81920k
        -Xmx80m

    The -Xmx option is equivalent to -XX:MaxHeapSize.
...
Geoff Langenderfer
  • 746
  • 1
  • 9
  • 21
Rishabh Sagar
  • 3,877
  • 3
  • 15
  • 24
  • 2
    FWIW org.gradle.daemon defaults to true so that line isn't needed. – Smalls Apr 06 '20 at 17:30
  • Worked perfectly for me. By default, there were no values for Gradle/Kotlin daemon and my IDE max heap was at the 2560 level. Thanks! – Cam Tullos Jun 16 '22 at 20:38
165

I was able to solve this for my React Native project by configuring the following:

1. gradle.properties

org.gradle.daemon=true
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

2. app/build.gradle

android {
    dexOptions {
       javaMaxHeapSize "3g"
    }
}
Ramesh R
  • 7,009
  • 4
  • 25
  • 38
Jordan Grant
  • 2,153
  • 2
  • 11
  • 10
54

The solution is to increase Android build memory.

As you add more modules to your app, there is an incredible demand placed on the Android build system, and the default memory settings will not work. To avoid OutOfMemoryErrors during Android builds, you should uncomment the alternate gradle memory setting present in /android/gradle.properties:

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

You can find gradle.properties inside android folder.

P.S.

What we are doing this and why it helps?

Let me clear some basic terminology for understanding the whole thing.

Daemon : - A daemon is a computer program that runs as a background process, rather than being under the direct control of an interactive user.

Android Studio 2.1 enables a new feature: Dex In Process, that can dramatically increase the speed of full clean builds as well as improving Instant Run performance.

To take advantage of Dex In Process, you’ll need to modify your gradle.properties file and increase the amount of memory allocated to the Gradle Daemon VM by 1 Gb, to a minimum of 2 Gb, using the org.gradle.jvmargs property:

Specifies the JVM arguments used for the daemon process. The setting is particularly useful for tweaking memory settings.

org.gradle.jvmargs=-Xmx2048m

Default value:

-Xmx10248m -XX:MaxPermSize=256m

The default Gradle Daemon VM memory allocation is 1 gigabyte — which is insufficient to support dexInProcess, so to take advantage you’ll need to set it to at least 2 gigabytes.

Dex in process works by allowing multiple DEX processes to run within a single VM that’s also shared with Gradle, which is why you need to allocate the extra memory before it can be enabled — that memory will be shared between Gradle and multiple DEX processes.

If you’ve increased the javaMaxHeapSize in your module-level build.gradle file beyond the default of 1 gigabyte, you’ll need increase the memory assigned to the Gradle Daemon correspondingly.

When there’s enough memory assigned Dex in Process is enabled by default, improving overall build performance and removing the overhead of starting multiple parallel VM instances. The result is a significant improvement in all build times, including Instant Run, incremental, and full builds.

Source : https://medium.com/google-developers/faster-android-studio-builds-with-dex-in-process-5988ed8aa37e

https://rnfirebase.io/#increasing-android-build-memory

Kailash Uniyal
  • 878
  • 1
  • 10
  • 14
  • 2
    Could you explain what this is doing and why it helps? – Alex Mar 24 '20 at 14:49
  • 2
    Put the sources as well. https://medium.com/google-developers/faster-android-studio-builds-with-dex-in-process-5988ed8aa37e – Rishabh Sagar Apr 06 '20 at 17:46
  • 1
    Hello @KailashUniyal what if i have the heap size at 2048 in android studio's gui and i’m still getting 'Expiring Daemon because JVM heap space is exhausted'? – abdi Apr 18 '20 at 15:07
  • 1
    @abdi Try putting this ```org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8``` in gradle.properties. If still not working then sorry I have no idea how to fix that. – Kailash Uniyal Apr 21 '20 at 14:18
  • 1
    un-commenting `org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8` in `android/gradle.properties` worked lika a charm. Thanks!! @KailashUniyal – Vikas Bansal Jul 18 '20 at 04:27
  • Random question, but for the default value, is `Xmx10248m` a typo? Shouldn't it be `1024m`? – twiz Sep 05 '21 at 14:55
  • No Twiz it's no typo. – Kailash Uniyal Sep 06 '21 at 09:08
  • @twiz Not sure what Android Studio passes by default, but Gradle's internal default is actually 512m. – herman Feb 14 '22 at 09:47
3

Balance memory consumption and build speed using gradle options. For sample

Android Studio 2022.1.1 (PC RAM 16GB)

Gradle v7.3.3 (./gradle/wrapper/gradle-wrapper.properties)

AGP v7.2.0 (./build.gradle)

com.android.tools.build:gradle:7.2.0

Cache Fix Gradle Plugin

org.gradle.android.cache-fix:org.gradle.android.cache-fix.gradle.plugin:2.5.3

This Google Services dependency version supports Gradle Configuration Cache

com.google.gms:google-services:4.3.5

./gradle.properties

android.enableJetifier=true
android.jetifier.ignorelist=bcprov-jdk15on
android.useAndroidX=true
kapt.incremental.apt=true
kapt.use.worker.api=true
kotlin.daemon.jvm.options=-Xms1g -Xmx4g
manifestmerger.enabled=true
org.gradle.caching=true
org.gradle.configureondemand=true
org.gradle.daemon=true
org.gradle.jvmargs=-XX:InitialHeapSize=1g -XX:MaxHeapSize=6g -XX:MaxPermSize=2g -XX:MaxMetaspaceSize=2g -XX:NewSize=1g -XX:MaxNewSize=2g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
org.gradle.unsafe.configuration-cache=true
org.gradle.unsafe.configuration-cache-problems=warn

Useful links:

https://proandroiddev.com/how-we-reduced-our-gradle-build-times-by-over-80-51f2b6d6b05b

https://developer.android.com/studio/build/profile-your-build#using-the-gradle---profile-option

guest
  • 432
  • 3
  • 8
1

In my case it was some kind of gradle bug probably. We had actually no memory problems, but the message kept on appearing. My solution was:

gradlew --no-daemon

Jarekczek
  • 7,456
  • 3
  • 46
  • 66
0

If you face this error with Jenkins, this is how I resolved the issue.

  1. Go to Dashboard > configuration.
  2. Add the following argument under Global Properties. You can set the memory value as your requirement. Here I have set 2048m.

Name:

GRADLE_OPTS

Value:

-Dorg.gradle.daemon=true -Dorg.gradle.jvmargs=-Xmx2048M 

enter image description here

Dhanusha_Perera07
  • 3,347
  • 5
  • 14
  • 22
0

I found a deamon process called org.gradle.launcher.daemon.bootstrap.GradleDaemon someVersion

after kill that process and click Reload all gradle project, it will build successfully

Sinux
  • 1,728
  • 3
  • 15
  • 28