문제 요약
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% 이내로 제한 권장