프로덕션 서버 메모리 이상을 JVM 지표로 감지하고 원인을 찾은 경험
인턴 때 Spring 기반 API 서버가 며칠에 한 번씩 응답 지연이 발생하는 이슈가 있었습니다. 장애 때마다 원인을 몰라 재시작했는데, 저는 먼저 JVM 지표를 수집하는 것부터 해보자고 했습니다.
Prometheus와 Grafana로 힙 사용량, GC 빈도, GC 소요 시간을 시각화했습니다. 데이터를 보니 Full GC가 지연 직전에 급증하는 패턴이 명확했습니다. 이전에 비해 객체 생성량이 늘어난 시점을 코드 배포 이력과 대조해 보니 특정 배포 이후부터 패턴이 시작됐습니다.
해당 배포의 변경사항을 분석해 List에 대량 데이터를 반복 변환하던 로직이 불필요한 객체를 너무 많이 만들고 있었습니다. 스트림으로 교체하니 GC 빈도가 정상으로 돌아왔습니다. 모니터링이 없었다면 재시작만 반복하다가 근본 원인을 몰랐을 것이라는 걸 배웠습니다.