dev_dbdb1114

[JAVA] 가비지컬렉터2 - 동작방식 본문

프로그래밍/JAVA

[JAVA] 가비지컬렉터2 - 동작방식

dbdb1114 2022. 12. 8. 14:46

기본적인 실행방식  ( stop the world -> mark and sweep )

1. Stop The World 

가비지 컬렉션을 실행하기 위해 JVM이 애플리케이션의 실행을 멈추는 작업이다. GC가 실행될 때는 GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업이 중단되고, GC가 완료되면 작업지 재개된다.

( 그래서 언제 멈추는건데 ==> Young 영역이나 Old 영역이 꽉차면 ==> 평소에 코드를 작성할 때 메모리 관리를 잘 할 필요성을 느꼈다. 메모리를 신경쓰지 않고 개발을 하다보면 아마 GC의 실행이 잦아질 것이고, 이것은 애플리케이션의 속도저하를 일으킬 것이다. 아마 그러면,, 자료구조, 알고리즘 모두 잘 해야겠네,,, )

당연히 모든 쓰레드들의 작업이 중단되면 애플리케이션이 멈추기 때문에, GC의 성능 개선을 위해 튜닝을 한다고 하면 보통 stop-the-world의 시간을 줄이는 작업을 하는 것이다. ( 오~ 새로운 정보~ 오,,, 이것도 재밌을듯... 근데 영어 잘해야겠다... ) 

또한 JVM에서도 이러한 문제를 해결하기 위해 다양한 실행 옵션을 제공하고 있다.

 

2. Mark and Sweep

-Mark : 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업

-Sweep: Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업

Stop The World를 통해 모든 작업을 중단시키면, GC는 스택의 모든 변수 또는 Reachable 객체를 스캔하면서 각각이 어떤 객체를 참고하고 있는지를 탐색하게 된다. 그리고 사용되고 있는 메모리를 식별하는데, 이러한 과정을 Mark라고 한다. 이후에 Mark가 되지 않은 객체들을 메모리에서 제거하는데, 이러한 과정을 Sweep이라고 한다.

 

 

Minor GC

Young영역의 구조 ==> Eden 영역 / Survivor 영역(2)

Eden 영역 : 새로 생성된 객체가 할당(Allocation)되는 영역 ( 해당 영역이 꽉 찼을 때 MinorGC가 발생 )

Survivor 영역 : 최소 1번의 GC 이상 살아남은 객체가 존재하는 영역

 

작동 순서 

  1. 새로 생성된 객체가 Eden 영역에 할당.
  2. Eden영역이 꽉 차고 MinorGC 실행
    1. Eden 영역에서 사용되지 않는 객체의 메모리가 해제된다.
    2. Eden 영역에서 살아남은 객체는 Survivor 영역으로 이동된다.
  3. 1~2번의 과정이 반복되다가 Survivor 영역이 가득 차게 되면 Survivor 영역의 살아남은 객체를 다른 Survivor 영역으로 이동시킨다.
    (1개의 Survivor 영역은 반드시 빈 상태가 된다.)
  4. 이러한 과정을 반복하여 계속해서 살아남은 객체는 Old 영역으로 이동하게 된다. ( 몇 번?? )

공부한 블로그에 있던 그림을 따라서 그려봤다. 

 

MagerGC

young영역에서 오래 살아남은 객체는 Old 영역으로 Promotion됨을 확인할 수 있다. 그리고 Major GC는 객체들이 계속 Promotion되어 Old 영역의 메모리가 부족해지면 발생하게 된다. Young 영역은 일반적으로 Old 영역보다 크기가 작기 때문에 GC가 보통 0.5초에서 1초 사이에 끝난다. 그렇기 때문에 Minor GC는 애플리케이션에 크게 영향을 주지 않는다. 하지만 Old 영역은 young 영역보다 크며 young 영역을 참조할 수도 있다. 그렇기 때문에 MajorGC는 일반적으로 MinorGC보다 시간이 오래 걸리며, 10배 이상의 시간을 사용한다.

 

GC종류 MinorGC MajorGC
대상 Young Generation Old Generation
실행 시점 Eden 영역이 곽 찬 경우 Old 영역이 꽉 찬 경우
실행 속도 빠르다 느리다

 

Comments