Java/Java 기타

[Java] 가비지 컬렉션의 여러가지 동작 알고리즘

excited-hyun 2021. 11. 16. 21:01
반응형
 

[Java] 메모리 구조와 가비지 컬렉션

Java의 메모리 구조 가비지 컬렉션에 대해 알아보기에 앞서 java의 메모리 영역에 대해 간단하게 다뤄보겠습니다. static / stack / heap  이렇게 세 영역으로 구분됩니다. Static 영역 하나의 JAVA 파일은

excited-hyun.tistory.com

 

위 게시물에 설명한 기본적인 GC 방식 외에도 여러가지 알고리즘을 이용한 방식들이 있습니다.

이번 게시물에서는 이러한 여러가지 방식들에 대해 다뤄보도록 하겠습니다.

 

Serial GC

Java SE 5, 6에서 사용되는 방식입니다.

가장 단순한 방식의 GC동작 방식으로 싱글 스레드로 동작합니다.

그렇기 때문에 다소 느려, Stop the world 시간이 비교적 긴 방식입니다.

Old 영역에서 Mark - Sweep - Compact 알고리즘을 사용합니다.

이 방식은 메모리가 작고 CPU의 코어 수가 적을 때 사용하기에 적합한 방식입니다.

Mark - Sweep - Compact

  1. Mark : 가비지 컬렉터가 살아있을 객체들을 확인하는 작업
  2. Sweep : 더 이상 참조되지 않는 Unreachable object들을 제거하는 작업
  3. Compact : sweep 이후 비게된 메모리 주소에 분산된 객체들을 Heap의 시작 주소로 모으는 작업

 

Parallel GC

Serial GC와 기본적인 알고리즘은 같지만 이 경우 Young 영역에서 싱글 스레드가 아닌 멀티 스레드를 이용하기 때문에 Serial GC보다 빠르게 객체를 처리합니다. 따라서 Stop the world 시간도 상대적으로 짧습니다.

Parallel Old GC

Parallel GC는 Young 영역에 대해서만 멀티 스레드 방식을 사용했다면, Parallel Old GC Old 영역까지 멀티스레드 방식을 사용합니다.

 

Concurrent Mark Sweep GC (CMS GC)

이 방식은 Stop the world로 자바 Application이 멈추는 것을 줄이기 위해서 만든 것 입니다.

Reachable한 객체를 한번에 찾는 것이 아닌 4개의 step으로 나눠서 찾는 방식을 이용합니다.

  1. Initial Mark : GC Root가 참조하는 객체만 마킹 (stop the world 발생 O)
  2. Concurrent Mark : 참조하는 객체를 따라가며, 지속적으로 마킹 (stop-the-world 발생 X)
  3. Remark : concurrent mark에서 변경된 사항이 없는지 다시 한번 마킹하며 확정 (stop the world 발생 O)
  4. Concurrent Sweep : 접근할 수 없는 객체를 제거 (stop-the-world 발생 X)

 

G1 GC (Garbage First GC)

이 방식은 위의 Young, Old 영역을 이용하는 방식과는 전혀 다른 방식입니다.

 

G1 GC는 체스판처럼 여러 영역에 객체를 할당하고 GC를 실행합니다.

비어있는 영역에만 새로운 객체가 들어가며 꽉 찬 영역에서 라이브 객체를 다른 영역으로 옮기고 꽉찬 영역을 비우는 방식으로 동작합니다.

즉 , 이는 Young 영역에서 Old 영역으로 이동하는 단계가 없는 방식입니다.

이 방식은 위의 방식들 보다 빠르게 실행이 가능하다는 장접도 있습니다.

728x90
반응형