가비지 컬렉션(GC)와 가비지 컬렉터, 힙 메모리 기초 지식 정리

LeeYulhee·2023년 11월 20일
0

👉 가비지 컬렉션(GC)과 가비지 컬렉터


  • 📌 가비지 컬렉션 (Garbage Collection)
    • 가비지 컬렉션은 자바 가상 머신(JVM)의 메모리 관리 프로세스의 일부로, 더 이상 사용되지 않는 메모리(가비지)를 자동으로 식별하고 회수하는 프로세스
    • 가비지 컬렉션은 사용되지 않는 객체를 식별하고, 그 메모리를 해제하여 재사용할 수 있게 만드는 과정을 포함
    • 수동 메모리 관리에서 발생할 수 있는 메모리 누수를 방지하고, 효율적인 메모리 사용을 가능하게 하여 애플리케이션의 성능을 유지시킴

  • 📌 가비지 컬렉터 (Garbage Collector)
    • 가비지 컬렉터는 가비지 컬렉션 프로세스를 실제로 수행하는 JVM의 구성 요소
      • 즉, 가비지 컬렉션을 구현하는 실제 메커니즘
    • 가비지 컬렉터는 힙 메모리 내에서 도달할 수 없는 객체들을 찾아내고, 이러한 객체들이 사용하고 있는 메모리를 해제함
    • Serial, Parallel, G1, CMS 등 다양한 가비지 컬렉터가 있으며, 각각의 가비지 컬렉터는 고유의 알고리즘과 수집 방식을 가지고 있음



👉 작동 원리


  • 객체의 생명주기
    • 객체가 생성되어 사용되고, 더 이상 참조되지 않게 되면 가비지로 간주됨
  • Reachability Analysis
    • GC는 "도달 가능성 분석"을 통해 더 이상 사용되지 않는 객체를 찾음
    • 도달 가능한 객체는 여전히 코드에서 사용되고 있는 객체
  • Mark and Sweep
    • 가장 기본적인 GC 알고리즘으로, 사용 중인 객체를 표시(Mark)한 후, 표시되지 않은 객체를 메모리에서 제거(Sweep)



👉 GC 알고리즘


  • Serial GC
    • 단일 스레드로 작동, 작은 애플리케이션에 적합
  • Parallel GC
    • 병렬로 여러 스레드에서 작동, 처리량(throughput)이 중요한 애플리케이션에 적합
    • Java 8 이하 버전의 기본 GC
  • Concurrent Mark Sweep (CMS) GC
    • 애플리케이션의 중단 시간을 최소화하고자 하는 경우에 적합
  • G1 GC
    • 큰 힙을 가진 멀티프로세서 시스템에서 사용, 메모리를 여러 영역으로 나눠 관리
    • Java 9 이상 버전의 기본 GC



👉 힙 메모리 영역


  • Young Generation
    • 새로 생성된 객체들이 저장되는 영역. 대부분의 객체가 여기서 생명을 마침
  • Old Generation
    • Young 영역에서 살아남은 객체들이 이동하는 영역
    • 더 오래 살아남은 객체들을 위한 공간
  • Permanent Generation (PermGen) / Metaspace
    • 클래스 메타데이터를 저장하는 영역
    • Java 8 이후 Metaspace로 대체됨



👉 GC 튜닝


  • GC 튜닝은 애플리케이션의 성능을 최적화하기 위해 메모리 할당과 GC 옵션을 조절하는 과정
  • -Xms-Xmx 옵션을 사용하여 힙 사이즈를 조절할 수 있음
  • GC 로그를 분석하여 GC의 효율성과 애플리케이션의 메모리 사용 패턴을 이해하는 것이 중요



👉 역할 비유


  • 가비지 컬렉션의 역할 : 청소부
    • 집 안의 쓰레기를 주기적으로 청소하는 청소부와 같음
    • 쓰레기가 쌓이면 공간이 부족해지고, 환경이 더러워져서 살기 불편해짐
    • 마찬가지로, 프로그램에서 더 이상 쓸모없는 데이터(가비지)가 메모리를 차지하고 있으면, 메모리가 부족해져 프로그램이 느려지거나 멈출 수 있음
    • GC는 이러한 불필요한 데이터를 정리하여 메모리를 깨끗하게 유지

  • 가비지 컬렉션의 작동 방식 : 책상 정리
    • 객체의 생명주기
      • 객체들은 책상 위의 서류철 같은 것이라고 생각할 수 있음
      • 필요할 때 서류철을 꺼내 사용하고, 더 이상 필요 없으면 책상에서 치워야 함
    • 도달 가능성 분석(Reachability Analysis)
      • GC는 어떤 서류철이 아직 필요한지, 더 이상 필요 없는지를 확인
      • 책상 위에 자주 쓰는 서류철은 남겨두고, 오래동안 만지지 않은 서류철은 가비지로 간주하고 치움

  • GC 알고리즘 : 다양한 청소 방법
    • Serial GC
      • 한 명의 청소부가 모든 청소를 담당하는 것과 같아서 작은 집에 적합
    • Parallel GC
      • 여러 청소부가 동시에 청소하는 것으로, 더 큰 집이나 사무실에 적합
    • Concurrent Mark Sweep (CMS) GC
      • 청소부가 사람들이 일하는 동안에도 조용히 청소하는 방식으로, 일의 중단을 최소화하고자 할 때 적합
    • G1 GC
      • 큰 건물에서 각 층마다 청소를 담당하는 청소부들이 있는 것처럼, 메모리를 여러 부분으로 나누어 관리

  • 힙 메모리 : 집의 방
    • Young Generation
      • 새로운 객체들이 저장되는 곳으로, 마치 집에서 가장 자주 쓰는 방과 같음
    • Old Generation
      • Young 영역에서 살아남은 객체들이 이동하는 곳으로, 덜 자주 쓰는 방과 같음
    • Permanent Generation/Metaspace
      • 클래스와 메타데이터를 저장하는 곳으로, 서재나 보관실과 비슷함

  • GC 튜닝 : 최적의 청소 일정 조정
    • GC 튜닝은 청소부의 일정을 조정하는 것과 같음
    • 너무 자주 청소하면 일하는데 방해가 되고, 너무 드물게 청소하면 쓰레기가 쌓임



➕ 힙 메모리 추가 공부(질문과 대답)


  • 힙 메모리 지정(힙 메모리는 누가 지정해서 부여하는지?)
    • 자동 지정
      • JVM이 기본적으로 힙 메모리의 초기 크기와 최대 크기를 결정
      • 이 값은 JVM 버전과 호스트 시스템의 아키텍처, 사용 가능한 메모리에 따라 다름
    • 사용자 지정
      • 사용자는 JVM을 시작할 때 명령줄 옵션(-Xms-Xmx)을 사용하여 힙 메모리의 초기 크기와 최대 크기를 설정할 수 있음

  • 자동으로 부여되는 힙 메모리의 크기(자동으로 부여되는 값은 얼마인지?)
    • 기본값
      • Java의 버전과 실행 환경에 따라 기본 힙 크기는 달라질 수 있음
      • 일반적으로, 초기 힙 크기는 시스템 메모리의 일부분(예: 전체 메모리의 1/64)으로 설정되며, 최대 힙 크기는 시스템 메모리의 일부분(예: 전체 메모리의 1/4)으로 설정됨

  • 힙 메모리를 늘리기 위한 사양(힙 메모리를 늘리려면 컴퓨터나 서버 사양이 좋아야 하는지?)
    • 사양의 중요성
      • 힙 메모리를 늘리기 위해서는 컴퓨터나 서버가 충분한 물리 메모리(RAM)를 가지고 있어야 함
      • 메모리가 부족하면 힙을 늘려도 실제로는 효과가 없을 수 있음
    • 성능 고려
      • 더 큰 힙은 가비지 컬렉션이 더 오래 걸릴 수 있으므로, CPU 성능도 중요

  • 힙 메모리 늘리기의 장단점(힙 메모리를 늘리면 어떤 장단점이 있는지?)
    • 장점
      • 애플리케이션에 더 많은 메모리를 할당하여 처리할 수 있으므로, 크고 복잡한 작업을 처리할 수 있음
      • 메모리 부족으로 인한 성능 저하를 예방할 수 있음
    • 단점
      • 힙이 커지면 가비지 컬렉션에 더 많은 시간이 소요될 수 있으며, 이는 전체 애플리케이션의 응답 시간에 영향을 줄 수 있음
      • 큰 힙은 메모리 관리의 복잡성을 증가시키고, 시스템의 다른 부분에 영향을 줄 수 있음
profile
끝없이 성장하고자 하는 백엔드 개발자입니다.

0개의 댓글

관련 채용 정보