OutOfMemoryError : GC 오버 헤드 제한 초과

1. 개요

간단히 말해서 JVM은 객체가 더 이상 사용되지 않을 때 메모리를 확보하는 작업을 처리합니다. 이 프로세스를 가비지 컬렉션 (GC)이라고합니다.

GC 오버 헤드 제한 초과 오류 패밀리로부터 하나 java.lang.OutOfMemoryError와 및 리소스 (메모리) 고갈의 표시이다.

이 빠른 기사에서는 java.lang.OutOfMemoryError : GC Overhead Limit Exceeded 오류의 원인과 해결 방법을 살펴 보겠습니다.

2. GC 오버 헤드 한도 초과 오류

OutOfMemoryErrorjava.lang.VirtualMachineError 의 하위 클래스입니다 . 자원 활용과 관련된 문제가 발생하면 JVM에서 발생합니다. 보다 구체적으로, JVM이 가비지 콜렉션을 수행하는 데 너무 많은 시간을 소비 하고 매우 적은 힙 공간 만 확보 할 수있을 때 오류가 발생합니다 .

Java 문서에 따르면 기본적으로 JVM은 Java 프로세스가 GC를 수행하는 시간의 98 % 이상을 소비하고 각 실행에서 힙의 2 % 미만 만 복구되는 경우이 오류를 발생 시키도록 구성됩니다. 즉, 이것은 우리 응용 프로그램이 사용 가능한 거의 모든 메모리를 소진했으며 가비지 수집기가 청소하는 데 너무 많은 시간을 소비하고 반복적으로 실패했음을 의미합니다.

이 상황에서 사용자는 응용 프로그램의 속도가 매우 느려집니다. 일반적으로 밀리 초 단위로 완료되는 특정 작업은 완료하는 데 더 많은 시간이 걸립니다. 이는 CPU가 가비지 수집을 위해 전체 용량을 사용하고 있으므로 다른 작업을 수행 할 수 없기 때문입니다.

3. 행동 오류

java.lang.OutOfMemoryError : GC Overhead Limit Exceeded를 발생 시키는 코드를 살펴 보겠습니다 .

예를 들어, 종료되지 않은 루프에 키-값 쌍을 추가하여이를 달성 할 수 있습니다.

public class OutOfMemoryGCLimitExceed { public static void addRandomDataToMap() { Map dataMap = new HashMap(); Random r = new Random(); while (true) { dataMap.put(r.nextInt(), String.valueOf(r.nextInt())); } } }

이 메소드가 호출되면 JVM 인수가 -Xmx100m -XX : + UseParallelGC ( Java 힙 크기가 100MB로 설정되고 GC 알고리즘이 ParallelGC 임)와 함께 java.lang.OutOfMemoryError : GC Overhead Limit Exceeded 오류가 발생합니다. 다양한 가비지 수집 알고리즘을 더 잘 이해하기 위해 Oracle의 Java Garbage Collection Basics 자습서를 확인할 수 있습니다.

프로젝트의 루트에서 다음 명령을 실행 하면 java.lang.OutOfMemoryError : GC Overhead Limit Exceeded 오류가 매우 빠르게 발생합니다.

mvn exec:exec

일부 상황에서는 GC Overhead Limit Exceeded 오류 가 발생하기 전에 힙 공간 오류가 발생할 수 있습니다 .

4. GC 오버 헤드 한도 초과 오류 해결

이상적인 솔루션은 메모리 누수에 대한 코드를 검사하여 애플리케이션의 근본적인 문제를 찾는 것입니다.

다음 질문에 답해야합니다.

  • 힙의 많은 부분을 차지하는 애플리케이션의 오브젝트는 무엇입니까?
  • 소스 코드의 어느 부분에 이러한 객체가 할당됩니까?

또한 java.lang.OutOfMemoryErrors를 포함한 코드에서 성능 문제를 감지하는 데 도움이되는 JConsole과 같은 자동화 된 그래픽 도구를 사용할 수도 있습니다 .

마지막 수단은 JVM 시작 구성을 변경하여 힙 크기를 늘리는 것입니다. 예를 들어 다음은 Java 애플리케이션에 1GB의 힙 공간을 제공합니다.

java -Xmx1024m com.xyz.TheClassName

그러나 실제 응용 프로그램 코드에 메모리 누수가 있으면 문제가 해결되지 않습니다. 대신 오류를 연기합니다. 따라서 응용 프로그램의 메모리 사용량을 철저하게 재평가하는 것이 좋습니다.

5. 결론

이 튜토리얼에서는 java.lang.OutOfMemoryError : GC Overhead Limit Exceeded 와 그 이유를 살펴 보았습니다 .

항상 그렇듯이이 기사와 관련된 소스 코드는 GitHub에서 찾을 수 있습니다.