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 |