본문 바로가기
etc

JAVA Garbage Collection

by 벽돌1 2021. 3. 9.

youtu.be/Fe3TVCEJhzo

배민 유투브를 통해 봤던 내용들을 정리합니다.

자바가 기준입니다.

 

Garbage Collection

JVM의 heap영역에서 사용하지 않는 객체를 삭제하는 프로세스

힙 영역에는 Object타입의 객체들이 들어간다.

 

GC Root

gc root는 stack의 데이터들, method영역의 static데이터, jni에 의해 생성된 객체들이 된다.

gc root -> heap으로 찾아서 없앤다

 

어떻게 garbage를 찾을까유

mark and sweep, compact

  • GC root에서부터 참조하는 객체들을 하나씩 찾아간다
  • reachable object, unreachable object를 찾아서 사용중인 객체들을 mark한다
  • unreachable 객체를 sweep(삭제)한다
  • reachable한 객체들을 한곳에 몰아서 메모리를 관리한다 compact

 

GC 실행과정

 

meta space : gc시에 필요한 것들이 쌓임

suvivor1이 있으면 0이 비어져있어야하고 0이 있으면 1이 비어져야한다 -> rolling?

 

  • 새로운 객체는 young generation에 할당된다.
  • minor gc 발생
  • mark
  • unreachable은  eden에서 지워지고 suvivor1에 할당(순서상관없음)
  • 다시 young generation에 객체들이 쌓이고
  • minor gc발생
  • mark
  • unreachable은  eden에서 지워지고 suvivor1에 할당된 객체들과 young generation의 reachable객체들이 suvivor0으로 이동 
  • minor gc가 발생될때마다 살아남은 객체들의 값이 1씩 증가
  • 오브젝트 값들이 특정 임계점이 넘으면 old generation으로 이동 promoted
  • 이때 old generation이 꽉차면 major gc가 일어난다

 

왜이렇게 구찮게...?

1. 대부분의 객체는 금방 접근 불가능한 상태가 된다.

 : young generation은 빨리빨리 gc가 일어나서 비워줘야한다

2. old generation의 객체들은 young generation을 참조할 가능성이 적다.

 : old는 가끔해도 돼

 

stop-the-world

gc를 실행하기 위해 gc를 실행하고 있는 스레드를 제외한 모든 스레드를 멈추는 것

 

  • setial GC : 싱글
  • parallel GC: java8 멀티스레드
  • parallel old gc : old 영역까지 멀티스레드
  • cms gc: compact과정이 없음
  • g1 gc(garbage first) : 힙 영역을 region으로 나누고 전체 힙이 아닌 region단위로 탐색 후 compact진행 할당된 region에 대해서만 gc를 실행한다.