팀장님 으로부터 요청이 들어왔다. (회원 통계 엑셀 생성 프로그램 제작)
SQL로 쿼리 결과를 하나 하나 엑셀에 대입 해주고 있는데 시간이 너무 오래 걸려서 요청하심 (3시간 이상 소요)
제작 후 Local, Dev 에서 테스트 후 운영에서 실행 하자마자 엑셀이 생성이 안된다는 응답이 왔다..!
원인 분석과 해결 과정을 정리 해보자.
✅ 원인 분석 과정
📌 로그확인
바로 로그부터 확인해봤다.
로그에서는 아무런 정보도 얻을 수 없었다….
그때 당시엔 쉘 스크립트에 OOM 발생시 Heap-dump를 생성해주는 아래 옵션도 주지 않은 상태였다. (팀의 모든 프로젝트가 그런듯?..)
1
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\PATH\지정
📌 jar 확인
나는 local, dev에서 동일한 jar로 다시 실행해봤다.. 정상 동작을 확인 했다.
📌 Intellij Profile 실행
Profile 모드로 실행하자 뭔가 이상한게 보였다.
XSSF, APache POI
쪽 로직이 실행 될 때마다 메모리가 빠른속도로 증가하는걸 확인했다.
즉시 -Xmx500m(운영과 동일한 메모리 할당)
옵션을 주고 실행해보니 OOM 발생으로 인한 종료인 것을 확인했다.
📌 HeapDump 생성 후 분석
부끄럽지만.. 사실 이때 visualVM
이란 툴을 처음 알았다.
HeapDump
를 분석하여 확인한 결과
많은 사이즈를 차지하는 Object가 바로 ElementXobj
, AttrXobj
2개 였습니다.
위 글을 정리하자면, XSSF는 엑셀의 모든 내용을 TreeMap으로 가지고 메모리에 로딩하여 OOM 발생 가능성이 높다는 것이었습니다.
📌 XSSFWorkbook 메모리 이슈
- 전체 데이터셋의 메모리 로딩
XSSFWorkbook
은 처리하는 엑셀 파일의 전체 데이터를 메모리에 로드한다.
- 메모리 효율성의 부족
- 파일의 모든 부분을 메모리에 상주시켜, 메모리 사용량이 급증 한 것이다.
즉, 위 문제점으로 인해 서비스가 OOM 발생후 중지된 것입니다.
✅ 해결
📌 SXSSFWorkbook 사용하기
- 스트리밍 방식 데이터 처리
- 엑셀 파일의 일부 데이터만 메모리에 유지하여 메모리 효율성 향상
- 대용턍 데이터 처리 용이
✅ 결과
메모리
: 3,000 MB -> 400 MB- 엑셀 정상 생성 확인
- 기존 sql로 엑셀 생성 (3시간) -> 5분