Spring Batch 대용량 S3 파일 다운로드 중 OutOfMemoryError 분석

문제 요약

Tasklet 내에서 S3Client.downloadFile() 호출 중 내부적으로 Apache Commons IO의 IOUtils.toByteArray(InputStream) 사용이 대량 메모리를 점유하며 OOM 발생

원인 분석

  • InputStream을 그대로 byte[]로 변환 후 문자열 처리 (new String(byte[]))
  • 대용량 파일 (수십 MB~수백 MB)이 반복적으로 처리되며 힙 메모리 점유 지속
  • GC로 회수되지 않는 구조 (한 번에 여러 파일 순차 처리)

개선 방안

  • 파일 내 유효성 검증을 위해 굳이 전체 문자열로 읽지 말고, InputStreamReader + BufferedReader.readLine() 로 처리
  • 한 파일 완료 후 객체 null 처리 및 System.gc() 유도
  • -XX:+UseG1GC -XX:+UseStringDeduplication 옵션 추가
  • 컨테이너 -Xmx가 적절히 설정되어야 하며, 전체 pod memory의 70~80% 이내로 제한 권장

관련 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다