본문 바로가기

Garbage Collection - 가비지 컬렉션

JVM의 Heap 영역에서는 실행 도중 계속해서 데이터가 추가된다. 메모리에는 한계가 있으므로 메모리를 관리해야 한다. 

Garbage Collection

GC는 JVM상에서 사용하지 않는 데이터를 메모리 상에서 해제시켜준다. 자동으로 동작하기 때문에 개발자가 메모리 관리를 해 줄 필요가 없다. 주 관리 메모리는 Heap 영역이다.

 

만약 코드 상에서 참조되지 않은 객체가 있다면 그러한 객체를 메모리에서 해제시킨다.

Reachability : 참조 되고 있다.
Reachable : 유효한 참조. 다른 메모리 영역에서 참조되면 Reachable로 판정한다.
Unreachable : 참조되지 않는 상태
Root-set : Reachable 로 인식되게 만들어주는 JVM Run-time Area

GC는 Unreachable 한 객체를 Garbage라고 인식한다.

 


GC Algorithm

GC는 자동으로 수행되기 때문에, 적절한 알고리즘이 필요하다.

 

Stop-The-World

JVM은 GC를 통해 여유 메모리를 확보할 수 있다. 그러나, GC자 자주 일어나면 프로그램 성능을 저하시킨다. GC가 일어나면, GC를 담당하는 Thread를 제외한 나머지 Thread는 일시 중지된다. 이 현상을 Stop-The-World라고 한다.

그래서 GC Algorithm은 Stop-The-World 시간을 줄여야 한다.

 

Weak Generational Hypothesis

위 가설의 내용은 아래와 같다

  • 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.
  • 대부분의 객체가 빠르게 Unreachable 한 상태로 전환이 된다

이 가설은 여러 관찰을 통해 증명이 되었다.

 


 

GC를 설명하기 위해서는 Heap 메모리 영역을 다시 봐야 한다.

JAVA8 버전 이후로 Perm Gen 영역은 Metaspace 영역으로 대체되었다.

Eden 에는 new 를 통해 새롭게 생성된 인스턴스가 위치하고, 이후에 Survivor Space로 이동한다.

Survivor Space에서는 Minor GC가 일어난다. 주요한 GC가 일어나는 부분은Old Gen 부분이다.

- Eden Space : 새롭게 생성된 인스턴스들이 위치. Scavenge GC가 일어난다.

- Young Geneartion : 생명주기가 짧은 '젋은 객체'를 GC 대상으로 한다. Minor GC가 일어난다. Major GC에 비해 빠르다.

- Old Generation : 생명주기가 긴 '오래된 객체' 를 GC 대상으로 한다. Major GC가 일어난다.

 

Minor GC

 객체는 최초에는 Eden에 위치하고, Eden 공간이 꽉 차면 참조되지 않은 객체를 삭제하고, 나머지 객체들을 S0 으로 이동시킨다. S0이 꽉 찰 때가지 이동시킨다.

 S0의 공간이 꽉 차면, S0의 객체는 S1로 이동한다. 실제로는 S0에서 S1으로 복사되지 않고 참조되는 포인터만 바뀐다. S0과 S1은 둘 중 하나는 반드시 비어있다. 여러번의 Minor GC에서 살아남은 객체들은 Old Generation으로 이동한다.

 

Minor GC는 빠르고, 쓰레드를 멈추게 하지 않는다. 사실 쓰레드는 멈추지만 매우 짧게 멈추기 때문에 멈추지 않는다고 간주한다. 많은 객체들이 Young Generation에 생성되었다가 사라진다.

Major GC

Thread를 잠시 멈추고 객체들의 상태 여부를 파악한다. 그래서 참조되지 않는 객체는 제거한다. 보통 Minor GC에 비해 10배 이상의 시간이 걸린다. Minor GC보다 적게 발생한다.

 

 

 

Mark And Sweep Algorithm

가장 기본적인 GC 알고리즘이다.

Mark Phase : Root-set에서 참조하는 객체들에 대해 마킹을 한다.

Sweep Phase : 마크되지 않은 객체들을 추적해서 삭제한다.

 

그러나, 이 알고리즘을 실행 할 경우 메모리가 Fragmentation 된다. 이 문제를 해결하기 위해 Mark And Compact Algorithm이 등장

 

Mark And Compact Algorithm

Mark And Sweep Algorithm 처럼 마킹하고, 마킹되지 않으면 삭제한다. 삭제 이후에 메모리를 정리해서 메모리 단편화를 해결한다. 많은 GC 알고리즘이 이 알고리즘을 바탕으로 하고 있다.

 

 

참고

https://heartsavior.medium.com/java-performance-tuning-white-paper-%EC%A0%95%EB%A6%AC-1-the-java-heap-746d8f7e2ee4
https://www.holaxprogramming.com/2013/07/20/java-jvm-gc/
https://d2.naver.com/helloworld/1329

'JAVA > JAVA' 카테고리의 다른 글

Synchronized (동기화) in Java  (0) 2024.01.14
Java Virtual Machine (JVM) & 자바 컴파일  (0) 2022.06.23
객체지향 & 절차지향 언어  (0) 2022.06.22
JAVA - 특징  (0) 2022.06.20