ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA - GC
    CS/Java 2021. 2. 18. 19:52

    GC


    GC

    • 프로그램이 동적으로 할당했던 메모리 영역 중 필요 없게 된 영역을 해제하는 기능이다.
    • JVM의 Heap영역을 관리한다.
    • 장점 
      1. 동적으로 할당한 메모리 영역의 전체를 완벽하기 관리할 필요가 없어진다.
      2. 다음과 같은 버그를 줄이거나 완전히 막을 수 있다.
        • 유효하지 않은 포인터 접근: 이미 해제된 메모리에 접근하는 버그.
        • 이중 해제: 이미 해제된 메모리를 다시 해제하는 버그.
        • 메모리 누수: 더는 필요하지 않은 메모리가 해제되지 않고 남아있는 버그.
    • 단점
      1. 어떤 메모리를 해제할지 결정하는데 비용이 발생한다.
      2. GC가 일어나는 타이밍이나 점유 시간을 예측하기 어렵다. 그러므로 프로그램이 예측 불가능하게 일시적으로 정지할 수 있으므로 실시간 시스템에는 적합하지 않다.

     

    GC의 종류

    1. Minor GC
      • JVM Heap의 Young영역(객체가 처음 생성될때 저장되는 영역)에서 돌아가는 GC이다.
      • 활성 객체만 남기고 비활성 객체는 Clear된다. 계속해서 활성 객체로 생존하는 객체들은 시간이 지남에 따라 Old영역으로 이동한다.
    2. Full GC
      • JVM Heap의 Old영역(Young영역에 존재하던 객체들이 오래되어 저장되는 영역)에서 돌아가는 GC이다.
      • Old영역이 Full이 되면 수행되며 Old영역을 스캔하여 참조되지 않는 객체를 해제한다.
      • Full GC가 일어나는 동안 JAVA 애플리케이션은 멈추기 때문에 속도가 느리고 성능에 아주 큰 영향을 끼친다.

     

    GC동작 과정

    1. 처음 생성된 객체는 Young영역의 일부인 Eden영역에 위치한다.
    2. Micor GC가 발생하면 다른 곳에서 참조되지 않는 객체는 메모리에서 제거된다.
    3. Eden영역에서 살아남은 객체는 Young영역의 또다른 일부인 Survival영역으로 이동한다.
    4. Survival영역은 Survival1과 Survival2영역으로 구성되어 있는데, Minor GC가 발생할 때마다 Survival1영역에서 Survival2영역으로 또는 Survival1영역에서 Survival2영역으로 객체가 이동한다.
    5. 이 과정에서 더이상 참조되지 않는 객체는 메모리에서 제거된다.
    6. Minor GC가 발생하는 동안 Survival1, Survival2 영역을 오가며 살아남은 객체는 최종적으로 Old영역으로 옮겨진다.
    7. Old영역에 있다가 미사용 된다고 식별되는 객체들은 Full GC를 통해 메모리에서 제거된다.

     

    포인터 추적 방식

    • 대부분의 GC기법은 포인터 추적 방식을 사용한다.
    • 한 개 이상의 변수가 접근 가능한 메모리는 앞으로 사용할 수 있는 메모리로 간주하고 그 밖의 메모리를 해제한다.

     

    reference

    goodgid.github.io/Java-Garbage-Collection-(1)/

    goodgid.github.io/Java-Garbage-Collection-(2)/

    mirinae312.github.io/develop/2018/06/04/jvm_gc.html

     

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

    JAVA - 오버로딩, 오버라이딩  (0) 2021.02.18
    JAVA - 인터페이스와 추상클래스  (0) 2021.02.18
    JAVA - JVM  (0) 2021.02.17
    JAVA - 접근 제어자  (0) 2021.02.17
    JAVA - 객체지향  (0) 2021.02.17

    댓글

Designed by Tistory.