HOME > android > tips

안드로이드 스튜디오 - "GC overhead limit exceeded" 에러 해결 방법

JSFollow18 May 2019

안드로이드 스튜디오에서 앱을 빌드할 때 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