Programing/Java

GC overhead limit exceeded

BUST 2018. 8. 10. 17:16

GC overhead limit exceeded


발생하는 이유

java.lang.OutOfMemoryError: GC overhead limit exceeded
  • CPU 사용량중 98%이상이 GC가 작동되는 경우 GC Overhead limit exceeded가 발생이 된다.
    • 대부분의 GC가 CPU를 사용하기 있기 때문에 user work은 작동이 되지 않는다.
  • 한정된 Heap Memory안에서 GC 대상의 객체는 없지만 새롭게 생성되는 객체가 메모리를 할당하지 못할경우에 GC의 시간이 길어지게된다.

에러가 발생되는 예제 코드

class Wrapper {
  public static void main(String args[]) throws Exception {
    Map map = System.getProperties();
    Random r = new Random();
    while (true) {
      map.put(r.nextInt(), "value");
    }
  }
}
  • map에서 계속해서 데이터를 넣는 샘플데이터
  • reference가 존재하기 때문에 메모리가 부족할때 대부분의 cpu를 gc에 사용을 하게 되고 GC overhead limit exceeded 에러가 발생된다.


해결방법

1. GC overhead limit exceeded Option 끄기

-XX:-UseGCOverheadLimit
  • 추천하지 않는 방법
  • GC overhead limit exceeded 가 왜 나왔는지 문제를 파악하는 것이 더 중요함.

2. heap 메모리 설정

java -Xmx1024m com.yourcompany.YourClass
  • 제일 간단한 방법, 해결하기 쉬운 방법,
  • 데이터 읽는 양이 많을 경우
    • 10만건을 한번에 읽어서 메모리상에서 데이터를 처리하는 경우
  • -Xmx : 최대 Heap Memory 설정
  • -Xms : 최소 Heap Memory 설정
  • 시스템에서 사용하는 메모리 (1g ~ 2g) 정도를 제외하는 것이 좋다.

3. heap dump를 통해 메모리 사용량 체크하기

  • Eclipse의 MAT 등을 활용하여 분석을 한다.


Reference


'Programing > Java' 카테고리의 다른 글

Executor service  (0) 2018.08.31
Java Generic (제너릭)  (0) 2018.08.14
전략 패턴 (Strategy Pattern)  (0) 2018.08.04
Rule Engine  (0) 2018.08.04
Adapter Pattern  (0) 2018.08.01