-
상황 : 320 만건 정도 되는 테이블이 2.5GiB 정도 되는 크기인데 8GB 인 서버에 데이터를 올리면 OOM 에러가 난다.
jconsole 로 heap 사용량 확인해봐도 충분한 용량.
jstat 으로 2초 마다 GC 정보 확인
- 데이터가 어느정도 로드된 후에는 GCT 가 점점 늘어난다.
- S0 , S1 은 Survivor 영역인데 S0은 0, S1은 계속 100프로로 고정되어 나온다.
* Minor GC가 발생할 때 Eden 에 있는 obj 들이 S0 혹은 S1 로 이동하고,
* Minor GC가 발생하면 S0 -> S1 혹은 S1 -> S0 으로 데이터가 옮겨지며 obj 의 age가 늘어나고, 한쪽은 완전히 비워진다.
* Meta 도 꽤 높이 차지하고 있다. 98-9% 였다가 MaxDirect 를 늘려주니까 96으로 아주 조금 떨어진 것 같다.
- 메모리 사용량 확인 : used 3,225,240 free 1,305,580
OOM 을 heapDUmp 로 떠서 MAT 로 분석.
결론 : ResultSet 쪽에서 발생하는 오류
ResultSet rs = loadStmt.executeQuery(loadQuery);
details >> 를 누르면
여기서 object 를 클릭하면 List ojbects > outgoing references 를 누르면 아래와 같은 list_objects 를 볼 수 있다.
retained Heap 에 2115608792 를 1024로 세 번 나누면 1.9 GB 이다.
Xmx를 1gb 늘려보고 Xms 를 Xmx 와 동일하게 늘렸다.
그리고 gc발생 시 이그나이트에서 connection time out 이 발생해 timeout 설정 시간을 늘렸더니 해결됨.
반응형