배너 이미지

힙 메모리 누수

2025. 4. 22. 10:06·CS공부/Java & Spring

JVM 애플리케이션에서 자주 발생하는
힙 메모리 부족(OutOfMemoryError)과 메모리 누수(Leak) 문제의 원인과 진단 방법,
그리고 이를 해결하기 위한 전략들을 정리하였다.


1. Heap 메모리 부족의 원인

원인 설명
객체 과다 생성 GC가 회수하지 못할 정도로 객체가 계속 생성됨
지속적인 참조 유지 사용 후에도 객체가 컬렉션 등에 남아 GC 대상이 아님
캐시 과다 LRU 없이 무한정 쌓이는 Map, 리스트 등
이벤트 리스너 누락 제거되지 않은 Listener로 인해 참조가 유지됨

2. 진단 방법

✅ GC 로그 확인

  • -Xlog:gc 옵션으로 GC 빈도, 정지 시간 확인
  • Full GC가 반복된다면 Old 영역 포화 가능성

✅ Heap Dump 분석

  • jmap -dump:format=b,file=heap.hprof <PID>
  • Eclipse MAT, VisualVM 등으로 힙 덤프 열람
  • Dominator Tree, Reference Chain 분석으로 누수 경로 추적

✅ OutOfMemoryError 메시지 확인

  • GC overhead limit exceeded: GC만 하고 있음
  • Java heap space: Heap 크기 초과
  • Metaspace: 클래스 수 과다, 리플렉션 등으로 발생 가능

3. 해결 전략

✔️ 불필요한 객체 참조 제거

  • 컬렉션 초기화, listener 제거 등

✔️ 캐시 관리 전략

  • LRU 기반 캐시 사용 (e.g. Guava Cache)
  • TTL(Time-To-Live) 설정 적용

✔️ WeakReference 활용

  • 강한 참조 대신 약한 참조로 GC 허용
  • Soft/Weak/Phantom Reference 차이 이해 필요

✔️ 힙 크기 조절

  • -Xmx 값을 점진적으로 증가
  • 하지만 근본 원인은 코드/설계 개선

학습 정리

Heap 메모리 부족이나 메모리 누수는 대부분 코드 설계나 자원 해제 실수에서 비롯된다.
진단 도구를 활용한 힙 분석과 GC 로그 해석은 문제 해결의 첫걸음이며,
특히 서버 애플리케이션의 안정성과 직결되기 때문에 사전 설계와 정기 모니터링이 중요하다.

'CS공부 > Java & Spring' 카테고리의 다른 글

Spring 내부 구조 - DispatcherServlet, 요청 흐름, 에러 처리  (0) 2025.04.22
Spring Boot @Transactional 어노테이션  (0) 2025.04.22
Spring Boot 프로젝트 horong 리팩토링  (1) 2025.04.22
가비지 컬렉션(Garbage Collection)  (0) 2025.04.21
JVM과 힙, 스택  (0) 2025.04.21
'CS공부/Java & Spring' 카테고리의 다른 글
  • Spring Boot @Transactional 어노테이션
  • Spring Boot 프로젝트 horong 리팩토링
  • 가비지 컬렉션(Garbage Collection)
  • JVM과 힙, 스택
quokkaST
quokkaST
  • quokkaST
    stquokka
    quokkaST
    • 개발자 (77)
      • n8n (2)
      • CS공부 (46)
        • Java & Spring (15)
        • 인프라 (7)
        • 운영체제 & 시스템 (9)
        • 기타 CS지식 (7)
        • 네트워크 (6)
        • 데이터베이스 (2)
      • 알고리즘 (16)
      • 프로젝트 (8)
        • 감정&금융챗봇 (8)
      • 리팩토링 (5)
        • horong (5)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
상단으로

티스토리툴바