ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 박사 학위 논문인 가비지 컬렉션
    Java 2023. 8. 9. 23:25
    test

     

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

     

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

     

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

     

     

     

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

     

     

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

     

    이를 통해 약한 세대 가설(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

    'Java' 카테고리의 다른 글

    Java 의 Generic Type Erasure  (0) 2023.08.31