Home POI 라이브러리 OOM 해결과정
Post
Cancel

POI 라이브러리 OOM 해결과정


팀장님 으로부터 요청이 들어왔다. (회원 통계 엑셀 생성 프로그램 제작)
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를 분석하여 확인한 결과 POI-OOM.png

많은 사이즈를 차지하는 Object가 바로 ElementXobj, AttrXobj 2개 였습니다.

구글 검색 결과

위 글을 정리하자면, XSSF는 엑셀의 모든 내용을 TreeMap으로 가지고 메모리에 로딩하여 OOM 발생 가능성이 높다는 것이었습니다.


📌 XSSFWorkbook 메모리 이슈

  • 전체 데이터셋의 메모리 로딩
    • XSSFWorkbook은 처리하는 엑셀 파일의 전체 데이터를 메모리에 로드한다.
  • 메모리 효율성의 부족
    • 파일의 모든 부분을 메모리에 상주시켜, 메모리 사용량이 급증 한 것이다.

즉, 위 문제점으로 인해 서비스가 OOM 발생후 중지된 것입니다.



✅ 해결

📌 SXSSFWorkbook 사용하기

  • 스트리밍 방식 데이터 처리
  • 엑셀 파일의 일부 데이터만 메모리에 유지하여 메모리 효율성 향상
  • 대용턍 데이터 처리 용이



✅ 결과

  • 메모리: 3,000 MB -> 400 MB
  • 엑셀 정상 생성 확인
  • 기존 sql로 엑셀 생성 (3시간) -> 5분
This post is written by PRO.

프로그래머스 - 미로 탈출

Jenkins + Nginx 무중단 배포