GC 로그와 힙 덤프로 메모리 누수 원인을 찾아낸 경험
인턴 때 Spring 기반 배치 서비스가 며칠 운영 후 메모리가 꽉 차서 재시작해야 하는 문제가 있었습니다. 원인을 모르는 상태로 재시작만 반복했는데, 제가 원인 파악을 해보겠다고 했습니다.
GC 로그를 활성화하고 VisualVM으로 힙 사용량 추이를 확인하니, 특정 객체가 GC 이후에도 계속 쌓이는 게 보였습니다. 힙 덤프를 분석하니 캐시 Map에 키를 넣기만 하고 제거하는 로직이 없었던 것이 원인이었습니다.
WeakHashMap으로 교체해 GC가 참조되지 않는 키를 자동으로 제거하도록 하니 메모리가 안정됐습니다. 메모리 문제를 추측으로 고치는 것과 프로파일러로 확인하고 고치는 것은 완전히 다른 일이라는 걸 그때 배웠습니다. 이후엔 성능 문제는 항상 측정 먼저 하는 습관이 생겼습니다.