[JAVA]Garbage Collection(GC)

호준·2023년 2월 24일
0

TIL

목록 보기
6/9
post-thumbnail

🎈GC(Garbage Collections)

  • GC(Garbage Collection)는 자바 애플리케이션에서 사용하지 않는 메모리를 자동으로 수거하는 기능

🎈JVM 메모리 영역

  • 자바에서는 Young 영역과 Old 영역으로 나뉜다.
  • Young 영역은 생성된지 얼마 되지 않은 객체들을 저장하는 장소.
    (Young 영역에서 시간이 지남에 다라서 우선 순위가 낮아지면 Old 영역으로 옮겨짐)
  • Old 영역은 생성된지 오래된 객체를 저장하는 장소
  • Perm 영역은 Class, Method 등의 코드가 저장되는 영역으로, JVM에 의해서 사용된다.

🎈Minor GC

  • Young 영역을 Minor GC라고 부른다. Young 영역은 Eden/ survivor 이라는 두 영역으로 또 나뉜다.
  • Eden 영역은 자바 객체가 생성되자마자 저장되는 곳
  • 이렇게 생성된 객체는 Minor GC가 발생할 때 Survior 영역으로 이동하게 된다.
  • Survivor 영역은 Survivor1과 Survivor2 두 영역으로 나뉘는데, Minor GC가 발생하면 Eden과 Survivor1에 활성 객체를 Survivor2로 복사한다.
  • Survivor1과 Eden 영역을 클리어하여 Survivor2에 활성객체만 있도록 한다.
  • 다음번 Minor GC가 발생하면 같은 원리로 Eden과 Survivor2 영역에서 활성객체를 Survivor1에 이동시킨다. 반복하면서 Minor GC 수행
  • Survivor에 오래된 객체는 Old영역으로 옮긴다.
  • 이러한 방식을 GC 알고리즘 Copy & Scavenge 라고 한다. 이 방식은 속도가 매우 빠르며 작은 크기의 메모리를 콜렉팅하는데 매우 효과적이다.
  • Minor GC의 경우에는 자주 일어나기 때문에 GC에 걸리는 시간이 잛은 알고리즘을 사용하는것이 적합하다.

🎈FULL GC

  • Old 영역의 가비지 컬렉션을 Full GC라고 부르며 Full GC에 사용되는 알고리즘을 Mark & compact 라고 한다.
  • Mark & Compack 알고리즘은 객체들의 참조를 확인하면서 참조가 연결되지 않은 객체를 표시한다. 이 작업이 끝나면 사용되지 않는 객체를 모두 표시하고 이 표시된 객체를 삭제한다.
  • Full GC는 속도가 매우 느리며, Full GC가 일어나는 도중에는 순간적으로 자바 애플리케이션이 멈춰버리기 대문에, Full GC가 일어나는 정도와 시간은 애플리케이션의 성능과 안정성에 아주 큰 영향을 미친다.

🎈GC가 중요한 이유

  • 가비지 컬렉션 중에서 Minor GC의 경우에는 보통 0.5 이내에 끝나기 때문에 큰 문제가 되지 않지만, Full GC의 경우네는 자바 애플리케이션이 멈춰 버리기 때문에, 문제가 될 수 있다.
  • 멈추는 동안 사용자의 요청이 큐에 들어있다가, 순간적으로 요청이 한꺼번에 들어오기 대문에 과부하에 의한 여러 장애를 만들 수 있다.
  • 따라서 원활한 서비를 위해서는 GC가 어떻게 일어나게 하느냐가 시스템의 안정성과 성능에 큰 변수로 작용할 수 있다.

🎈Stop-the-world

  • GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다.
  • stop-the-world가 발생하면 GC를 실행하는 스레드를 제외한 나머지 스레드는 모두 작업을 멈춘다.
  • GC 작업을 완료한 이후에야 중단했던 작업을 다시 시작한다.
  • 어떤 GC 알고리즘을 사용하더라도 stop-the-world가 발생한다.
  • GC 튜닝이란 stop-the-world 시간을 줄이는 것이다.

참고

profile
도전하자

0개의 댓글