Java

박사 학위 논문인 가비지 컬렉션

BBiRaRiRo 2023. 8. 9. 23:25

 

자바는 블루 칼라(주로 생산직에 종사하는 육체 노동자) 언어입니다.박사 학위 논문 주제가 아니라 일을 하려고 만든 언어죠.
— 제임스 고슬링(자바의 아버지) —

 

저수준 세부를 일일이 신경쓰지 않는 대가로 저수준 제어권을 포기한다는 사상이 자바의 핵심이다.

 

아버지 입장에서는 ‘메모리 해제' 라는건 박사 학위 논문 급이니
우리보고 이런 대단한건 신경쓸 시간에 소녀시대 노래를 들으라고 하는거같다.

 

 

 

그 대단한 박사 학위 논문 주제를 해주는 가비지 컬렉션을 알아보자.

 

 

위의 표는 대부분의 객체 들이 짧은 시간동안만 활동한다는것을 확인한 그래프 이다.

 

이를 통해 약한 세대 가설(weak generational hypothesis) 이 만들어졌고

객체의 대부분을 짧은 기간만 활동하기에

JVM 의 Heap 영역을 설계할때도

젊은 객체를 빠르게 수집할수있도록 설계하게 되었다.

 

 

JVM 의 힙 메모리 영영은 3개의 세션으로 나뉜다

새로 만들어진 젊은 객체 는 Young(New) Generation 공간에 존재 하게되며

Young Generation 영역은 3가지로 세분화가 된다.

  • Eden Space
    새로운 객체의 시작은 이 영역에서 시작된다
  • To Space
    젊은 객체들중 GC 에 의해 소멸되지 않은 젊은 객체가 이곳으로 이동한다
  • From Space
    젊은 객체들중 GC 에 의해 소멸되지 않은 젊은 객체가 이곳으로 이동한다

 

To Space 와 From Space 모두 Eden Space 에서 소멸하지 않은 젊은 객체들이 있는 공간인데

이를 합쳐서 Survivor Space 라고 부르기도 하고

각각 S0,S1 혹은 S1,S2 로 표기 하기도한다.

 

Young Generation 에서 동작하는 GC 를 Minor GC 라 부르며 아래와 같이 동작한다.

 

  1. Eden Space 가 가득차서 새로운 젊은 객체를 생성하지 못할때 동작한다.
    1. Minor GC 는 Eden Space에서 수명을 다한 객체를 회수한다.
    2. Minor GC 에서도 살아남은 객체들은 To Space 로 이동한다.
    3. Space를 이동한 객체들의 generational count가 증가한다.
  2. Eden Space 가 가득차서 동작한다.
    1. Minor GC 는 Eden Space에서 수명을 다한 객체를 회수한다.
    2. To Space 에서 Minor GC 에게 살아남은 객체들은 From Space 로 이동한다.
    3. Eden Space에서 Minor GC 에게 살아남은 객체들은 From Space 로 이동한다.
    4. Space를 이동한 객체들의 generational count가 증가한다.
  3. Eden Space 가 가득차서 동작한다.
    1. Minor GC 는 Eden Space에서 수명을 다한 객체를 회수한다.
    2. From Space 에서 Minor GC 에게 살아남은 객체들은 To Space 로 이동한다.
    3. Eden Space에서 Minor GC 에게 살아남은 객체들은 To Space 로 이동한다.
    4. Space를 이동한 객체들의 generational count가 증가한다.

 

결국 Minor GC 에게서 생존한 객체들은

한번은 ToSpace로, 한번은 FromSpace로 이동하게되는데

Survivor Space 가 두개인 이유는 메모리 단편화를 해결하여 연속된 메모리 공간을 확보하기 위함이다.

 

Minor GC 가 Eden Space 보다 Survivor Space 의 객체를 먼저 이동하는 이유는

Eden Space 보다 Survivor Space 안의 객체가 더 수명이 길 가능성이 있기때문이다

이렇게 Young Generation 에서 게속 살아남아 generational count 가 충분히 증가한 객체는

Old Generation 으로 이동한다.

 

Old Generation 에서 동작하는 Major GC 도 Old Generation이 꽉 찼을 때 수행된다.

 

또한 대부분 Old Generation은 Young Generation 보다 용량을 크게 잡기 때문에 객체의 갯수도 많아서 GC 시간이 길다.

가비지 컬렉션이 동작할때는 어플리케이션 스레드를 모두 멈추는 현상이 발생하며 이를 Stop the World 라 부른다.

 

따라서 GC 튜닝 이라고 하면 Stop the World 의 시간을 줄이는 일이고

Stop the World 의 시간을 줄이기위해서는 회수 해가는 젊은 객체의 수를 줄이면 되고

젊은 객체의 수를 줄이려면 젊은 객체의 영역을 줄이면 된다.

 

 

 

 

참고 및 출처

https://docs.oracle.com/en/java/javase/16/gctuning/garbage-collector-implementation.html#GUID-71D796B3-CBAB-4D80-B5C3-2620E45F6E5D

https://perfectacle.github.io/2019/05/07/jvm-gc-basic/

https://mangkyu.tistory.com/118