GC stop the world 를 알아보자!

Karim·2022년 7월 16일
5

study

목록 보기
3/7
post-thumbnail

1. stop the world 란

💡 stop the world

  • GC를 실행하기 위해 JVM이 모든 애플리케이션 실행을 멈추는 것
  • stop-the-world가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다.
  • GC작업을 완료한 이후에 작업을 다시 시작
  • 어떤 가비지 컬렉터 알고리즘을 사용하더라도 stop-the-world는 발생한다.

2. GC ?

💡 Garbage Collector

  • 자바의 메모리 관리 방법
  • JVM의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 영역주기적으로 삭제하는 프로세스
  • heap 메모리에서 동적으로 할당되어 사용 중인 객체와 사용하지 않는 객체를 식별하고 사용하지 않는 객체를 삭제하는 작업

사용 중인 객체 판단 ?

  • 객체로 선언된 변수(stack)의 경우 Heap 메모리에 할당된 객체의 주소를 가리키는 포인터 역할을 한다.
  • 객체 변수의 역할을 모두 끝내고 사라지더라도 Heap 메모리에 할당된 객체들은 그래도 남아 있음
  • 객체의 주소값을 가지고 있는 변수가 없으면 GC는 접근한 수 없는 객체라고 판단해서 지운다.

3. 메모리 구조

💡 Young 영역 (heap)

  • 새롭게 생성한 객체의 대부분이 여기에 위치
  • 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다.
  • 이 영역에서 객체가 사라질때 Minor GC가 발생한다고 말한다.

- eden ==> survivor space

  • 새로 생성한 대부분의 객체는 Eden 영역에 위치
  • eden 영역에서 GC가 한 번 발생한 후 살아남은 객체Survivor 영역 중 하나로 이동
  • 하나의 Survivor 영역이 가득 차게 되면 그 중에서 살아남은 객체를 다른 Survivor 영역으로 이동
  • 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 Old 영역으로 이동

    Survivor 영역 중 하나는 반드시 비어 있는 상태로 남아 있어야 한다.
    만약 두 Survivor 영역에 모두 데이터가 존재하거나, 두 영역 모두 사용량이 0이라면 시스템은 정상적인 상황이 아니다.

💡 Old 영역 (heap)

  • Young 영역에서 살아남은 객체가 여기로 복사
  • Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생
  • 이 영역에서 객체가 사라질 때 Major GC(혹은 Full GC)가 발생한다고 말한다.
  • old 영역은 기본적으로 데이터가 가득 차면 GC를 실행

4. 번외

💡 native memory (off heap)

  • Metaspace는 Native memory 영역으로, OS가 자동으로 크기를 조절 (옵션으로 Metaspace의 크기를 줄일 수도 있다.)
  • Native 메모리는 OS 레벨에서 관리하는 영역으로 구분
  • class의 메타데이터를 담는 곳
  • Off-heap store에 저장되는 객체는 직렬화(Serialize)한 다음 저장
  • Allocation/Deallocation 비용이 일반 버퍼에 비해 높다.
  • Off-heap store에 저장되는 객체는 사이즈가 크고(Large) 오랫동안 메모리에 살아있는(Long-lived) 객체이면서 시스템 네이티브 I/O 연산(Memory Mamped I/O)의 대상이 되는 객체를 사용하는게 좋다.
  • Off-heap으로 객체들을 옮겨 On-heap 사이즈를 줄이게 되면, Full GC로부터 발생할 수 있는 성능 저하 요인많이 저감된다.

📌 여담

  • 기초부터 차근차근..!

📚 참고

profile
나도 보기 위해 정리해 놓은 벨로그

0개의 댓글