1. 발생 경험 소개
> “네, OOM을 직접 겪은 경험이 있습니다. 예를 들어, Spring 기반 서버에서 특정 배치 작업이나 대량 트래픽 유입 시 java.lang.OutOfMemoryError: Java heap space가 발생한 적이 있습니다.”
2. 문제 파악 방법
로그 분석: OOM 발생 시점의 catalina.out / 애플리케이션 로그 확인.
Heap dump 분석: -XX:+HeapDumpOnOutOfMemoryError 옵션으로 덤프를 남겨 Eclipse MAT이나 VisualVM 같은 툴로 메모리 누수 객체 추적.
모니터링 지표: JVM GC 로그, Prometheus/Grafana 대시보드, NewRelic/APM 등으로 heap 사용량 추적.
패턴 확인: 특정 API 호출 시, 혹은 특정 스케줄러 실행 시마다 메모리가 비정상적으로 증가하는 패턴 확인.
3. 원인 & 해결
메모리 누수: 캐시에 넣고 제거하지 않는 객체, DB 커넥션 close 누락 → 코드 수정.
대량 데이터 처리 방식 문제: 수십만 건을 한 번에 메모리에 로드 → 스트리밍 처리(ResultSet fetchSize, cursor, Stream API)로 변경.
잘못된 라이브러리 사용: JSON 직렬화 시 무한 참조 구조 → Jackson @JsonIgnore / DTO 분리.
JVM 설정 부족: 단순히 heap size가 너무 작음 → -Xmx 조정.
4. 예방책
사전 부하 테스트(JMeter, Gatling)로 병목 검증.
JVM 모니터링/알람 시스템 구축.
캐시 사용 시 eviction 정책 적용.
주기적으로 heap dump 분석 & 코드 리뷰.
---
완성 답변 예시 (면접용 1분 버전)
> “네, 대용량 데이터 처리 과정에서 OutOfMemoryError를 경험한 적이 있습니다.
당시에는 한 번에 수십만 건 데이터를 메모리에 적재하는 방식이라 heap이 부족했습니다. 문제를 파악하기 위해 GC 로그와 heap dump를 분석했고, 데이터가 스트리밍되지 않고 전부 적재되는 걸 확인했습니다. 해결책으로는 JDBC fetchSize를 적용하고 스트리밍 기반 처리로 변경했습니다.
이후에는 JMeter 부하 테스트를 통해 재발을 막았고, JVM 모니터링과 캐시 정책도 개선했습니다.
이런 경험을 통해, OOM은 단순히 heap을 늘리는 게 아니라 근본적인 데이터 처리 방식과 코드 구조를 점검해야 한다는 걸 배웠습니다.”
'Spring & Backend' 카테고리의 다른 글
| 이터러블 프로토콜에 대해 설명해주세요. (0) | 2025.09.03 |
|---|---|
| 싱글턴 패턴이란 무엇인가요? (0) | 2025.09.03 |
| Progressive Partial Rendering(PPR)에 대해서 설명해주세요 (4) | 2025.09.02 |
| XSS 공격이란 무엇이며, 프론트엔드에서 이를 방어하기 위한 방법을 설명해주세요. (0) | 2025.09.02 |
| 어떤 이유로 코루틴을 사용한 작업 처리가 기존 스레드 방식보다 가벼운지 설명해주세요. (0) | 2025.09.02 |
