안드로이드 스튜디오에서 앱을 빌드할 때 GC overhead limit exceeded
에러가 발생하면서 실패하는 경우가 있습니다.
저의 경우 아래와 같은 콜스택이 출력되면서 OutOfMemoryError가 발생하였는데요. 해결방법은 gradle.properties
에서 메모리 사이즈 늘리도록 설정을 변경하는 것입니다.
OOM이 발생하는 원인을 제거할 수 있겠지만, 원인찾기가 어려워 메모리 사이즈를 늘려 해결하였습니다.
Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
at com.android.tools.r8.org.objectweb.asm.tree.MethodNode.visitMethodInsn(MethodNode.java:409)
at com.android.tools.r8.org.objectweb.asm.ClassReader.readCode(ClassReader.java:2212)
at com.android.tools.r8.org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1275)
at com.android.tools.r8.org.objectweb.asm.ClassReader.accept(ClassReader.java:679)
at com.android.tools.r8.org.objectweb.asm.ClassReader.accept(ClassReader.java:391)
at com.android.tools.r8.graph.JarCode.parseCode(JarCode.java:323)
at com.android.tools.r8.graph.JarCode.triggerDelayedParsingIfNeccessary(JarCode.java:293)
at com.android.tools.r8.graph.JarCode.registerCodeReferences(JarCode.java:220)
at com.android.tools.r8.graph.DexEncodedMethod.registerCodeReferences(DexEncodedMethod.java:766)
at com.android.tools.r8.shaking.Enqueuer.processNewlyLiveMethod(Enqueuer.java:1647)
at com.android.tools.r8.shaking.Enqueuer.trace(Enqueuer.java:1489)
at com.android.tools.r8.shaking.Enqueuer.traceApplication(Enqueuer.java:1450)
at com.android.tools.r8.R8.run(R8.java:322)
at com.android.tools.r8.R8.run(R8.java:251)
at com.android.tools.r8.R8.lambda$runForTesting$1(R8.java:242)
at com.android.tools.r8.R8$$Lambda$583/1536098948.run(Unknown Source)
at com.android.tools.r8.utils.ExceptionUtils.withCompilationHandler(ExceptionUtils.java:62)
at com.android.tools.r8.utils.ExceptionUtils.withR8CompilationHandler(ExceptionUtils.java:50)
at com.android.tools.r8.R8.runForTesting(R8.java:238)
at com.android.tools.r8.R8.run(R8.java:148)
at com.android.builder.dexing.R8Tool.runR8(r8Tool.kt:189)
at com.android.build.gradle.internal.transforms.R8Transform.transform(R8Transform.kt:260)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:239)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:235)
at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102)
at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:230)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:47)
해결방법
gradle.properties
에 다음과 같이 메모리를 늘려주시면 됩니다. 주석은 디폴트로 설정된다는 메모리 사이즈입니다.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=4096m -XX:+HeapDumpOnOutOfMemoryError
Recommended Posts:
- AIDEGen으로 IDE에서 Android Framework 개발
- Android - adb shell input 명령어 사용 방법
- Android - App VersionCode, VersionName 등 설치 정보 확인
- Android - Call Stack 출력하는 방법
- Android 앱의 SQLite DB 테이블 확인
- Java 코드를 DEX로 변환, 안드로이드 디바이스에서 실행
- Android - adb로 실행 중인 프로세스, 쓰레드 리스트 & 메모리 정보 확인
- Android - PlayStore 앱 설치(다운로드) 화면으로 이동하는 방법
- Android - 파일의 MimeType(확장자) 가져오는 방법
- Mockito cannot mock/spy final class 에러 해결 방법
- Android Studio에서 Google Test로 C++ unit 테스트 작성
- Android - Native(C++)에서 Call stack 출력하는 방법
- Android Emulator에서 adb remount 하는 방법 (Writable)