ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] Garbage Collector
    CS/Java 2021. 7. 17. 21:37

    📝 Garbage Collector


    ✨ 해당 글은 아래 [10분 테코톡]을 듣고 작성했습니다.✨

     



    🙋‍♀️ 먼저 JVM에 대해 간단하게 알아보고 가자.

    • OS의 메모리 영역에 접근하여 메모리를 관리하는 프로그램이다.
    • 자바 바이너리 코드(.class) 를 읽고 검증하며 실행 환경의 규격을 제공한다.
    • 메모리 관리, GC를 수행한다.



    📌 GC란 무엇일까?

     

    🔎 먼저 간단하게 알아보자.

     

    - Garbage Collector

    • 동적으로 할당된 메모리 영역 중 사용하지 않는 영역을 탐지하여 메모리에서 해제하는 기능을 제공한다.

     


    🔎 동적으로 할당된 메모리란 무엇일까?

     

    - JVM의 Runtimdata Area

    • JVM의 메모리 영역으로 자바 어플리케이션 실행시 사용되는 데이터를 적재하는 영역이다.
    • Method, Stack, Heap, PC Register, Native Method Area가 있다.


    - JVM의 Stack 영역

    • 정적으로 할당된 메모리 영역이다.
    • 지역변수, 파라미터 리턴값, 연산에 사용되는 임시 값 들을 저장한다.


    - JVM의 Heap 영역

    • 동적으로 할당된 메모리 영역이다.
    • new 키워드로 생성된 객체와 배열이 저장된다.
    • 이 영역을 관리하는 것이 GC이다.



    📌 GC 과정을 알아보자.

     

    🔎 먼저 간단하게 알아보자!

     

    1. GC가 Stack의 모든 변수를 스캔하며 각각 어떤 Heap의 객체를 참조하고 있는지 찾아서 마킹한다.
    2. 해당 객체가 또 참조하고 있는 객체가 있다면 찾아서 마킹한다.
    3. 마킹되지 않은 객체를 Heap에서 제거한다.

     

    🔎 GC는 언제 일어날까?


    - Heap의 영역은 다음과 같은 영역으로 나누어져 있다.

    • Young영역 - Eden, Survivar1, Survival2
    • Old영역


    - Heap의 데이터는 다음과 같은 순서대로 영역에 저장된다.

    • 새로운 객체 생성 -> Eden영역 -> (Survival1 영역 <-> Survival2 영역) -> Old 영역


    - Heap의 각 영역에 따라 발동되는 GC 또한 다르다.

    • Minor GC - Young영역에서 더 이상 참조되지 않는 객체의 메모리를 해제한다. 각 영역의 메모리가 다 차게 되면 실행된다.
    • Full GC - Old영역에서 더 이상 참조되지 않는 객체의 메모리를 해제한다. Old 영역의 메모리가 다 차게 되면 실행된다.

     

     

    🔎 그럼, GC 동작과정을 전체적으로 살펴보자.

     

    1. 처음 생성된 객체는 Young의 Eden에 저장된다.
    2. Eden영역이 다 차게 되면 Minor GC가 발동되어 참조되지 않는 객체를 메모리에서 해제한다.
    3. 이때 살아남은 객체는 Survival영역으로 이동한다.
    4. Survival 영역은 두 영역으로 나뉘어져 있다. 한 영역이 꽉 차서 Minor GC가 발동될 때마다 Survival1 영역에 있던 객체가 Survival2 영역으로 이동한다. (또 GC 발생시 반대로 이동)
    5. Survival1 영역과 Survival2 영역을 오가며 살아남은 객체는 최종적으로 Old 영역으로 옮겨지게 된다.
    6. Old영역이 Full이 되면 Full GC가 발동되고, 이때 JAVA 어플리케이션은 멈추기 때문에 성능에 큰 영향을 끼치게 된다.



    📌 추가적으로 GC의 종류에 대해 알아보자.

     

    🔎 Serial GC


    - GC를 처리하는 스레드가 1개이다.

    • CPU 코어가 1개만 있을때 사용하는 방식이다.
    • Mark-Cpmpact Collection 알고리즘을 사용한다. - GC후 남은 메모리를 한 곳으로 모아주어서 단편화를 없애준다.

     

     

    🔎 Parallel GC


    - GC를 처리하는 스레드가 여러개이다.

    • Serial GC보다 빠르게 처리할 수 있다.
    • 메모리와 코어의 개수가 충분할 때 사용하면 좋다.

     

     

    🔎 Concurrent Mark Sweep GC (CMS)


    - Full GC시 자바 어플리케이션이 중단되는 시간을 줄인다.

    • Old 영역에서 사용된다.
    • 응답 시간이 빨라야 할 때 사용한다.
    • 다른 GC보다 메모리와 CPU를 많이 사용한다.



    🔎 G1 GC

    - 각 영역을 Region 영역으로 나눈다. (Eden, Survival, Old 내부에서 Region으로 또 나눠준다.)

    • GC가 일어날 때, 전체 영역(Eden, Sruvival, Old)을 탐색하지 않는다.
    • 꽉 찬 Region 영역에 대해서만 GC를 수행한다.
    • 자바 어플리케이션이 중단되는 시간이 짧다.

     

    'CS > Java' 카테고리의 다른 글

    [JAVA] 함수형 프로그래밍  (0) 2021.08.07
    JAVA - 프레임워크, 라이브러리  (0) 2021.03.01
    JAVA - 디자인 패턴  (0) 2021.03.01
    JAVA - 데이터 타입, 변수  (0) 2021.02.28
    JAVA - Servlet  (0) 2021.02.28

    댓글

Designed by Tistory.