[GC] Mark And Sweep vs Mark And Compact

2025. 5. 4. 20:56·Language/Java

 

과거 자바의 `GC`에 관해 알아보았을 때 `Mark And Sweep`만 알고 공부했었는데, 
추후 `Mark Anc Compact`를 알게 되어 둘의 차이점에 관해 간단하게 정리하려고 한다.

 

 

 

Mark And Sweep

  • Mark 단계:
    • 살아있는 객체들은 마킹하고, 살아있지 않은 객체들에 관해서는 마킹을 수행하지 않는다.
  • Sweep 단계:
    • Mark되지 않은 쓰레기 객체들(참조되지 않은 객체)을 찾아 제거
    • 위 과정은 메모리에서 객체를 청소하는 단계
    • 이때, 메모리의 단편화가 발생할 수 있음
      • 왜냐? 삭제만 할 뿐 JVM의 메모리에 이곳저곳 남아있기 때문

 

Mark And Compact

  • `Mark And Compact`는 `Mark And Sweep`의 확장된 버전으로, Sweep 단계 후 객체들을 압축하여 메모리 단편화를 방지한다.
  • Mark 단계:
    • `Mark And Sweep` 단계와 비슷하게 살아있는 객체들을 마킹한다.
  • Compact 단계:
    • Marking된 살아있는 객체들을 압축하여 메모리 공간에 연속적으로 배치한다.
      • 이렇게 하므로, 메모리 단편화를 줄일 수 있다.
    • 하지만, Compact 단계가 추가되므로, 압축 작업이 추가되어 성능에 영향을 줄 수 있다.
    • 결과적으로는 메모리 효율성은 더욱 향상

 

`Mark And Sweep` 방식과 `Mark And Compact`은 주로 `Young Generation`에 사용되며,
`Old Generation`에서는 유사한 방식이 사용된다고 한다.

 

참고

`GC`를 최적화 한다는 것은 `Stop the World` 상황을 최대한 짧게 최적화 한다는 것을 의미.

 

이때, `Virtual Thread`를 너무 남발하면(Virtual Thread는 힙 영역에 저장)
`Stop the World` 상황이 너무 발생해서 `STW`이 자주 일어나게 된다.

 

그래서 유의해야 하긴 하지만, `Virtual Thread`는 대부분의 경우에서 긍정적이라고 생각되어 알고만 있으면 좋을 것 같다.

 

저작자표시 비영리 변경금지 (새창열림)

'Language > Java' 카테고리의 다른 글

[Java] 코드 캐시(Code Cache)  (0) 2025.06.01
[Java] Java를 복습해보자  (1) 2025.01.05
[Java] 자바 구성  (0) 2024.03.31
'Language/Java' 카테고리의 다른 글
  • [Java] 코드 캐시(Code Cache)
  • [Java] Java를 복습해보자
  • [Java] 자바 구성
진꿈청
진꿈청
기록하는 개발자가 되기를 희망하는 진꿈청입니다. 사소한 개발 일지도 기록하기 위해 노력하겠습니다
  • 진꿈청
    기록형 개발자 희망
    진꿈청
  • 전체
    오늘
    어제
    • 분류 전체보기 (379)
      • 개발 기록 (140)
      • Language (12)
        • Java (4)
        • Python (0)
        • Kotlin (8)
      • Spring (51)
        • JPA (9)
        • AOP (1)
        • Batch (1)
        • Cloud (4)
        • WebSocket (11)
        • 유용한 정보 (9)
        • 동시성 & Lock (7)
        • Test (7)
      • DevOps (3)
        • AWS (3)
      • Docker (7)
      • Git (1)
      • PS (53)
        • 프로그래머스 (16)
        • 백준 (36)
        • goorm (1)
      • 프로젝트 (39)
        • 토이 프로젝트 (9)
        • FitTrip (16)
        • StudyWithMe (14)
      • Ceph (3)
      • CS (10)
        • Network (6)
        • OS (4)
      • Design Pattern (8)
      • Infra (40)
        • Jenkins (13)
        • DevOps (7)
        • Kubernetes (10)
        • NGINX (4)
        • Flyway (1)
        • Kafka (1)
      • DB (7)
        • Redis (5)
        • MongoDB (1)
        • PostgreSQL (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    김영한
    Spring JPA
    Spring cloud
    ansible
    spring rest docs
    Kubernetes
    Redis
    JPA
    java
    kotlin
    디자인 패턴
    Design Pattern
    springboot
    fittrip
    Spring
    AWS EC2
    Jenkins
    websocket
    openfeign
    flyway
    백준
    Spring Cloud Gateway
    Kafka
    프로그래머스
    ApplicationEventPublisher
    k8s
    @Transactional
    Github Actions
    docker
    nginx
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
진꿈청
[GC] Mark And Sweep vs Mark And Compact
상단으로

티스토리툴바