가비지 컬렉션(GC) 알고리즘과 여러 방법::자바

2020. 7. 7. 17:44computer science/java

가비지 컬렉션(Garbage Collection)이란?

 Java 애플리케이션에서 사용하지 않는 메모리를 자동으로 해제하는 기능입니다.

 

 전통적인 C언어에서는 malloc(), free() 등을 이용해 메모리를 할당하고, 수동으로 메모리를 해제해야 했습니다.

 하지만 Java에서는 GC 기술을 이용해 자동으로 메모리를 해제하여 개발자에게 메모리 관리로부터 자유롭게 해 주었습니다.

 

 

 우선, 애플리케이션에서 사용하는 영역은 New/Young(Eden, Survivor1, Survivor2)과 Old가 있습니다.

 

 Eden 영역은 자바 객체가 생성되자마자 저장되는 장소입니다.

 New/Young 영역의 GC를 Minor GC라고 하고, Old 영역의 GC는 Full FC라고 합니다.

 

 Full GC가 발생하면 순간적으로 Java 애플리케이션의 동작이 중단되기 때문에 속도가 비교적 느리고, 성능과 안정성에 큰 영향을 끼칠 수 있습니다.

 

 

1. Default GC

 

 기본적인 GC 방법으로 Minor GC에서 Copy & Scavenge 알고리즘을 사용하고, Full GC에서 Mark & Compact 알고리즘을 사용하는 방법입니다.

 

Copy & Scavenge

 Minor GC가 발생하면 Eden과 Survivor1의 활성 객체를 Survivor2로 복사하고, Eden과 Survivor1 영역을 비웁니다.

 다음 Minor GC가 발생하면 Eden과 Survivor2의 활성 객체를 Survivor1로 복사하고, Eden과 Survivor2 영역을 비웁니다.

 

 다음과 같은 작업을 반복적으로 수행해 오래된 객체는 Old 영역으로 옮겨지게 됩니다.

 

 속도가 비교적 빠르고, 작은 크기의 메모리를 Collecting 하는데 효과적인 알고리즘입니다.

 

Mark & Compact

 전체 객체의 참조를 확인해 참조되지 않은 객체를 표시하고, 표시된 객체의 메모리를 반환하거나 사용하는 객체로 대체하는 알고리즘입니다.

 

 

2. Parallel GC

 

 스레드의 수를 지정하고, 여러 스레드를 동시에 이용해 GC를 수행하는 방법으로 매우 빠르게 동작합니다.

 Low-pause 방식과 Throughput 방식이 있습니다.

 

Low-pause

 

 GC를 빠르게 수행하기보다 순간적으로 애플리케이션의 동작이 중단되는 현상(pause)을 최소화하는데 초점을 맞춘 방식입니다.

 

Throughput

 

 Minor GC의 신속한 수행에 초점을 맞춘 방식으로 Full GC에서는 오직 Mark & Compact 알고리즘만 사용합니다.

 

 

3. Concurrent GC

 

 Parallel GC의 Low-pause와 유사한 방식으로 애플리케이션이 돌아가는 단계에서 GC를 수행하고, 최소한의 작업만 애플리케이션의 동작을 중단시키고 수행해 pause 시간을 최소화합니다.

 

 

4. Incremental GC(Train GC)

 

 Concurrent GC와 유사한 방법으로 pause 시간을 최소화하기 위한 의도가 있지만, Minor GC가 일어날 때마다 Old 영역의 GC를 조금씩 수행해 Full GC가 발생하는 횟수를 줄입니다.

 

 자원을 많이 소모하고, Minor GC를 자주 일으키기 때문에 오히려 느려지는 경우가 있습니다.

'computer science > java' 카테고리의 다른 글

String, StringBuffer, StringBuilder::자바  (0) 2020.07.03
Vector와 ArrayList 비교::자바  (2) 2020.07.03
OOP와 SOLID::자바  (2) 2020.06.13