Git :)

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Garbage Collection
    Java 2023. 11. 9. 22:44

    # Garbage Collection(GC) 란?

    • JVM의 Runtime Data Area에는 Heap 영역이라는 곳이 있는데, 이 영역 내부에 참조되고 있지 않는(사용되고 있지 않는) 객체를 삭제해주는 것을 GC라고 한다.

    # GC를 왜 할까?

    • 메모리의 자원은 한정돼 있는데, 사용하지 않는 데이터가 자리를 차지하고 있으면 당연히 비효율적이기 때문에.
    • C와 C++은 개발자가 수동으로 메모리 할당과 해제를 일일이 해줘야한다. 하지만 Java는 JVM의 GC가 일괄적으로 관리해주기 때문에 개발자는 비즈니스 로직 구현에만 집중할 수 있다.

    # GC의 단점

    • 메모리가 언제 해제되는지 정확하게 알 수 없어 제어하기 힘들다.
    • 가비지 컬렉션(GC)이 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생되는 문제점이 있다.
      • Stop The World Event 라고 부른다.

    # GC의 대상

    객체에 레퍼런스가 있다면 Reachable로 구분되고, 객체에 유효한 레퍼런스가 없다면 Unreachable로 구분해버리고 수거해버린다. 

    • Reachable : 객체가 참조되고 있는 상태
    • Unreachable  : 객체가 참조되고 있지 않은 상태 (GC의 대상이 됨) 


    # GC 대상으로 만드는 방법

    Student student = new Student();
    student = null;
    • 객체참조 변수 값에 null을 입력하는 방법
    Student studentOne = new Student();
    Student studentTwo = new Student();
    studentOne = studentTwo;

     

    • 첫번째 줄의 new Student(); 로 생성된 객체는 GC의 대상이 될 것이다.
    register(new Student());
    • 실무에서도 내가 자주 쓰는 방법인데, 변수 자체를 선언하지 않고 new 연산자로 객체만 생성하는 경우
      • (위 처럼 new 연산자로 객체만 생성하는 경우를 anonymous object 라고 부른다.)
    • GC에서 Mark And Sweep 이란 알고리즘을 통해 사용하지 않는 객체를 제거해준다.

     

    • Mark 과정 : 먼저 Root Space로부터 그래프 순회를 통해 연결된 객체들을 찾아내어 각각 어떤 객체를 참조하고 있는지 찾아서 마킹한다.
    • Sweep 과정 : 참조하고 있지 않은 객체 즉 Unreachable 객체들을 Heap에서 제거한다.
    • Compact 과정 : Sweep 후에 분산된 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축한다. (가비지 컬렉터 종류에 따라 하지 않는 경우도 있음)

    # GC의 종류

    1. Serial GC

    • 서버의 CPU 코어가 1개일 때 사용하기 위해 개발된 가장 단순한 GC
    • GC를 처리하는 쓰레드가 1개 (싱글 쓰레드) 이어서 가장 stop-the-world 시간이 길다.
    • Minor GC 에는 Mark-Sweep을 사용하고, Major GC에는 Mark-Sweep-Compact를 사용한다.
    • 보통 실무에서 사용하는 경우는 없다 (디바이스 성능이 안좋아서 CPU 코어가 1개인 경우에만 사용) 

    2. Parallel GC

    • Java 5~8의 디폴트 GC
    •  Serial GC와 기본적인 알고리즘은 같지만, Young 영역의 Minor GC를 멀티 쓰레드로 수행
    • Old 영역은 여전히 싱글 쓰레드이며 Serial GC에 비해 stop-the-world 시간 감소

    3. Parallel Old GC

    • Young 영역 뿐만 아니라, Old 영역에서도 멀티 쓰레드로 GC 수행

    4. CMS GC (Concurrent Mark Sweep)

    • 어플리케이션의 쓰레드와 GC 쓰레드가 동시에 실행되어 stop-the-world 시간을 최대한 줄이기 위해 고안된 GC
    • 단, GC 과정이 매우 복잡해짐.
    • GC 대상을 파악하는 과정이 복잡한 여러단계로 수행되기 때문에 다른 GC 대비 CPU 사용량이 높다
    • 메모리 파편화 문제

    5. G1 GC (Garbage First)

    • CMS GC를 대체하기 위해 jdk 7 버전에서 최초로 release된 GC 
    • Java 9+ 버전의 디폴트 GC로 지정 4GB 이상의 힙 메모리, Stop the World 시간이 0.5초 정도 필요한 상황에 사용
      • (Heap이 너무작을경우 미사용 권장)
    • 기존의 GC 알고리즘에서는 Heap 영역을 물리적으로 고정된 Young / Old 영역으로 나누어 사용하였지만
    • G1 gc는 아예 이러한 개념을 뒤엎는 Region이라는 개념을 새로 도입하여 사용.전체 Heap 영역을 Region이라는 영역으로 체스같이 분할하여 상황에 따라 Eden, Survivor, Old 등 역할을 고정이 아닌 동적으로 부여 Garbage로 가득찬 영역을 빠르게 회수하여 빈 공간을 확보하므로, 결국 GC 빈도가 줄어드는 효과를 얻게 되는 원리

    6. Z Garbage Collector

    • Java 15에 release
    • 대량의 메모리(8MB ~ 16TB)를 low-latency로 잘 처리하기 위해 디자인 된 GC
    • G1의 Region 처럼,  ZGC는 ZPage라는 영역을 사용하며, G1의 Region은 크기가 고정인데 비해, ZPage는 2mb 배수로 동적으로 운영됨. (큰 객체가 들어오면 2^ 로 영역을 구성해서 처리)
    • ZGC가 내세우는 최대 장점 중 하나는 힙 크기가 증가하더도 'stop-the-world'의 시간이 절대 10ms를 넘지 않는다는 것

     

     

    출처 : https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC

    'Java' 카테고리의 다른 글

    메소드 레퍼런스(Method Reference)  (0) 2024.04.27
    Enum 활용방안  (0) 2023.12.01
    자바의 Reflection 활용하기  (0) 2023.11.08
    String Constant Pool 이란?  (0) 2023.11.08
    멀티프로세스와 멀티스레드  (0) 2023.10.31