엄지월드

[6차시] 메모리 관리 및 GC 최적화 : 메모리 문제 예방과 안정적인 시스템 운영 본문

기타

[6차시] 메모리 관리 및 GC 최적화 : 메모리 문제 예방과 안정적인 시스템 운영

킨글 2025. 3. 23. 16:27

JVM 메모리 구조

  • JVM 메모리 구조
    • JVM 메모리의 주요 영역
      • Heap
      • Stack
      • Meta space
      • Code Cache
  • Heap 메모리
    • Young Generation
      • Eden, Survivor 영역으로 나뉨
    • Old Generation
      • 오래 살아남은 객체들이 저장됨
    • Minor GC vs Major GC
  • Stack 메모리
    • 메서드 호출 시 지역 변수 저장
    • 메서드 호출 및 반환 시 스택 프레임 추가 및 제거
    • Stack 메모리의 한계 (고정 크기)
  •  Metaspace
    • 클래스 메타데이터 저장
    • PermGen과 Metaspace의 차이점
    • 네이티브 메모리 사용
  • Code Cache
    • JIT 컴파일러가 변환한 기계어 저장
    • 자주 사용되는 코드 실행 속도 향상
    • Code Cache 크기 조정 방법(-XX:ReservedCodeCacheSize)

GC 알고리즘과 동작 원리

  • GC개요
    • Minor GC
      • Young Generation에서 발생, 가벼운 작업
    • Major GC
      • Old Generation에서 발생, 전체 어플리케이션 멈춤
    • Stop-the-world 이벤트
      • GC 중 어플리케이션이 일시적으로 멈춤
  • Serial GC
    • 단일 스레드로 동작
    • 적합한 환경 : 소규모 어플리케이션, 단일 코어 CPU
    • 단점 : 멀티코어 환경에서 성능 저하, GC 실행 시 어플리케이션 전체 중단
  • Parallel GC
    • 멀티스레드로 GC 작업 처리
    • 적합한 환경 : 다중 코어 시스템, 서버 애플리케이션
    • 장점 : GC 실행 시간이 짧아짐
    • 단점 : 여전히 Stop-the-world 이벤트 발생
  • CMS GC
    • GC 작업이 어플리케이션과 동시에 진행
    • 적합한 환경 : 사용자 대기 시간이 중요한 어플리케이션
    • 장점 : 낮은 대기 시간
    • 단점 : CPU 사용량 증가, 메모리 단편화 가능성
  • G1(Garbage-First) GC
    • 힙 메모리를 여러 영으로 나누어 처리
    • 적합한 환경 : 대규모 메모리 사용, 대규모 시스템
    • 장점 : 예측 가능한 지연 시간 제공
    • 단점 : 약간의 추가 메모리 사용
  • Z GC
    • 초저지연 GC
    • 적합한 환경 : 대규모 메모리 사용, 초고성능 요구 어플리케이션
    • 장점 : 거의 없는 Stop-the-world 시간(10ms미만)
    • JVM 버전 제약(JDK 11 이상에서 사용 가능), 더 높은 메모리 사용
  • GC 알고리즘 선택 가이드
    • 소규모 어플리케이션 : Serial GC
    • 서버 어플리케이션 : Parallel GC
    • 대기 시간이 중요한 경우 : CMS GC
    • 대규모 메모리 환경 : G1 GC
    • 초저지연, 대용량 메모리 환경 : ZGC 
  • GC 로그 활성화 옵션
    • -XX:+PrintGCDetails : GC 이벤트와 메모리 사용량을 자세히 기록
    • -XX:+PrintGCDateStamps : GC 발생 시각을 타임스탬프 형식으로 기록
    • -Xloggc:<file-path> : 로그 파일 경로 지정
  • GC 로그 기본 구조
    • GC 이벤트 종류 : Minor GC, Major GC
    • 메모리 상태 : GC 전후 메모리 사용량, GC에 소요된 시간
    • 타임스탬프 : GC가 발생한 시각 

  • GC 로그 분석의 주요 지표
    • GC 발생 빈도 : Minor GC와 Major GC가 얼마나 자주 발생하는지 
    • GC 소요 시간 : 각 GC 이벤트에 소요된 시간 
    • Stop-the-world 시간 : 어플리케이션이 멈춘 시간
    • 메모리 해제 비율 : GC 후 메모리가 얼마나 회수되었는지
  • GC 로그 분석 예시
    • Full GC / 메모리 누수로 인한 Major GC 증가
    • 0.98은 애플리케이션에 영향을 줄 수 있는 지표다. 

  • GC 로그 분석 예시
    • Minor GC 빈도 증가
    • Heap 메모리가 부족할 경우 증가 가능 
    • 0.04에서 0.05로 늘어난 것 확인 가능

  • GC 로그를 활용한 성능 최적화
    • 힙 메모리 크기 조정
    • Xms : 초기 힙 메모리 크기 설정
    • Xmx : 최대 힙 메모리 크기 설정 
    • 적절한 크기 설정으로 GC 빈도 감소
  • GC 알고리즘 선택
    • CMS GC : 대기 시간이 중요한 환경에 적합
    • G1 GC : 예측 가능한 성능을 제공, 대규모 메모리 환경에 적합
    • ZGC : 초저지연 환경, 대용량 메모리 어플리케이션에 적합 
  • Stop-the-world 시간 줄이기
    • 적절한 GC 알고리즘 선택 : G1 GC, ZCC 등
    • 힙 크기 최적화 : 충분한 메모리 제공으로 GC빈도 및 시간 감소
    • 실시간 로그 분석 : GC 이벤트에 따른 성능 변화 모니터링

메모리 모니터링

  • 실시간 모니터링의 필요성
    • 메모리 누수 및 GC 이벤트 과다 발생 조기 감지
    • 어플리케이션 성능 문제에 대한 즉각 대응
    • 메모리 사용량, GC빈도, CPU 사용률 실시간 확인
  • Spring Boot Actuator
    • /actuator/heath : 어플리케이션 상태 확인
    • /actuator/metric : 메모리 사용량, GC 활동, CPU 사용량 등 실시간 메트릭 제공
    • /actuator/threaddump : 스레드 덤프 제공
    • Spring Boot Admin UI를 통해 시각적으로 확인 가능
  • Spring Boot Actuator
    • /actuator/metrics/jvm.memory.used : 힙 메모리 사용량
    • /actuator/metrics/jvm.gc.pause : GC로 인한             일시 정지 시간 모니터링
    • /actuator/metrics/jvm.memory.max : JVM 메모리 최대 크기
  • Promethus & Grafana
    • Prometheus : 실시간 메트릭 수집, 메모리 사용량, GC 상태 추적
    • Grafana : 실시간 대시보드 시각화, 커스텀 알람 설정
    • 통합 모니터링 : 여러 서버 및 마이크로서비스의 상태 통합 관리
Comments