React Native Android 빌드 중 “Daemon will expire after the build…” 경고 해결 방법

React Native Android 릴리즈 빌드 과정에서 다음과 같은 경고가 출력되는 경우가 있다.
1442 actionable tasks: 120 executed, 1322 up-to-date
The Daemon will expire after the build after running out of JVM Metaspace.
The project memory settings are likely not configured or are configured to an insufficient value.
...처음 보면 빌드가 실패한 것처럼 보이지만, 실제로는 빌드가 정상적으로 완료된 상태이다.
이 메시지는 Gradle 데몬(Gradle Daemon) 의 JVM Metaspace 영역이 부족하여
현재 빌드 이후 데몬을 종료하고 다음 빌드 시 재시작하겠다는 의미이다.
Gradle 데몬(Daemon)의 역할
Gradle 데몬은 JVM을 백그라운드에서 상시 실행하여 빌드 속도를 향상시키는 프로세스이다.
빌드할 때마다 JVM을 새로 띄우는 대신, 이미 실행 중인 JVM을 재사용함으로써
초기화 시간을 줄이고 빌드 효율을 높인다.
첫 빌드 시:
> Starting Gradle Daemon이후 빌드 시:
> Connecting to the Gradle Daemon
위와 같은 로그가 출력되면 데몬이 이미 떠 있는 상태에서 빌드가 진행되고 있음을 의미한다.
경고 메시지의 의미
이 메시지는 JVM의 Metaspace(클래스 메타데이터 저장 공간)가 부족하다는 뜻이다.
Gradle은 이를 감지하고, 현재 빌드는 완료하되 빌드 종료 후 데몬을 종료하도록 처리한다.
즉, 빌드 자체에는 문제가 없으며, 다음 빌드에서 새 데몬이 시작되기 때문에 속도가 다소 느려질 수 있음을 알리는 경고이다.
JVM 메모리 설정 조정
android/gradle.properties 파일에 다음 설정을 추가하거나 수정한다.
# JVM Heap 및 Metaspace 크기 확장
org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=1024m -Dfile.encoding=UTF-8🔹 -Xmx4g
JVM 힙(Heap) 메모리의 “최대 크기”를 4GB로 지정한다.”
힙(Heap)은 JVM이 실행 중에 생성되는 객체(클래스 인스턴스, 배열 등) 를 저장하는 영역이다.
-Xmx옵션은 “최대 힙 크기”를 지정하는 옵션이고,
여기서는4g→ 최대 4기가바이트까지 사용할 수 있다는 뜻이다.이 값이 너무 작으면 빌드 중
OutOfMemoryError: Java heap space오류가 발생할 수 있음.너무 크게 잡으면 다른 프로세스에 영향을 줄 수 있으니 시스템 RAM 대비 적정하게 설정하는 것이 중요함.
즉 빌드 과정에서 Gradle이 객체를 많이 생성하거나 메모리 캐시를 사용하는 경우를 대비해 여유를 둔 설정이다.
🔹 -XX:MaxMetaspaceSize=1024m
JVM의 Metaspace(클래스 메타데이터 저장 영역)의 최대 크기를 1GB로 지정한다.
Metaspace는 JVM이 클래스 로딩 시 필요한 메타데이터(클래스 이름, 메서드, 필드, 상속 구조 등)를 저장하는 공간이다.
Java 8 이후 PermGen이 사라지고 Metaspace로 대체되었으며,
이 공간은 시스템의 네이티브 메모리(Heap 외부 메모리) 에서 관리된다.Gradle은 빌드할 때 수많은 클래스(특히 Kotlin/Java 플러그인, React Native, Android Gradle Plugin 등)를 로드하기 때문에
Metaspace가 부족하면 다음과 같은 경고를 발생시킨다:The Daemon will expire after the build after running out of JVM Metaspace.이 값을 넉넉히 1GB(
1024m) 정도로 잡으면 데몬이 자주 죽는 현상을 막을 수 있다.
즉 클래스 로딩 관련 메모리 부족을 방지하고 Gradle 데몬의 안정성을 높이는 설정이다.
🔹 -Dfile.encoding=UTF-8
JVM에서 사용하는 기본 문자 인코딩을 UTF-8로 지정한다.
Java 애플리케이션은 기본적으로 운영체제의 로케일(locale)에 따라 인코딩을 결정한다.
예를 들어 Windows에서는CP949나MS949가 기본일 수 있다.이런 경우 빌드 스크립트나 리소스 파일에서 한글이 포함된 문자열을 읽거나 쓸 때
인코딩 깨짐(“???”, “\uXXXX” 형태)이 발생할 수 있다.이 옵션을 설정하면 JVM이 항상 UTF-8 인코딩을 사용하므로
빌드 로그, 문자열 리소스, 파일 입출력 모두에서 인코딩 문제를 방지할 수 있다.
즉 모든 빌드 환경(Windows, macOS, Linux)에서 인코딩을 통일하기 위한 설정이다.
참고
1회성 빌드로 데몬을 비활성화 하고 싶을 때
./gradlew --no-daemon assembleRelease
로그만 숨기고 싶을때
org.gradle.daemon.performance.disable-logging=true