Garbage Collector(가비지 컬렉터) 와 그 작동 원리

leedong617·2024년 9월 4일
post-thumbnail

Garbage Collector(가비지 컬렉터)는 프로그래밍 언어의 메모리 관리 기법 중 하나로, 더 이상 사용되지 않는 객체나 메모리 영역을 자동으로 해제하는 역할을 함. 프로그래머가 직접 메모리를 해제하는 방식(C나 C++의 경우)과 달리, 가비지 컬렉터는 시스템이 자동으로 불필요한 메모리를 해제하여 메모리 누수를 방지하고, 프로그램의 안정성을 높여줌. 주로 자바(Java), C#, Python 등 메모리 관리를 자동으로 처리하는 언어에서 사용됨.

Garbage Collector의 기본 개념

가비지 컬렉터는 프로그램이 동작하면서 할당한 메모리 중 더 이상 참조되지 않는 객체나 변수를 찾아서 해제함. 이는 메모리 관리의 자동화를 통해 프로그래머가 메모리 관리를 일일이 신경 쓰지 않아도 되게 해줌.

주요 개념

가비지(Garbage)

더 이상 필요하지 않거나 참조되지 않는 메모리 영역을 의미함. 예를 들어, 어떤 객체가 생성되었지만 이후 프로그램에서 더 이상 사용되지 않거나 참조되지 않는다면, 그 객체는 가비지로 간주됨.

참조 카운트(Reference Counting)

특정 객체가 얼마나 많이 참조되는지 카운트하는 방식으로, 참조 카운트가 0이 되면 가비지로 판단함.

가비지 컬렉션의 필요성

프로그래밍에서 메모리는 한정된 자원임. 메모리를 효율적으로 관리하지 않으면 메모리 누수가 발생해 시스템이 불안정해지거나, 프로그램이 메모리 부족으로 인해 중단될 수 있음. 가비지 컬렉터는 이러한 문제를 방지하여 다음과 같은 이점을 제공함

자동 메모리 관리

프로그래머가 메모리를 수동으로 해제할 필요 없이, 가비지 컬렉터가 자동으로 처리함.

메모리 누수 방지

참조되지 않는 객체를 자동으로 제거함으로써 메모리 누수를 방지함.

프로그래밍 편의성

메모리 해제와 같은 저수준의 작업에 신경 쓰지 않아도 되므로, 보다 간결한 코드를 작성할 수 있음.

가비지 컬렉터의 작동 원리

가비지 컬렉터는 다음과 같은 주요 알고리즘을 사용하여 불필요한 메모리를 찾아 해제함.

1. Mark and Sweep (마크 앤 스윕)

가장 기본적인 가비지 컬렉션 알고리즘 중 하나임.

Mark(마크)

먼저, 현재 프로그램에서 참조되고 있는 객체들을 찾아 "마크"함. 이는 참조되고 있는 객체가 어떤 것인지를 표시하는 단계임.

Sweep(스윕)

참조되지 않고 마크되지 않은 객체들을 가비지로 간주하고, 해당 메모리를 해제함.

2. Generational Garbage Collection (세대별 가비지 컬렉션)

객체를 생명 주기에 따라 관리하는 방식임. 이 방식은 자주 생성되고 빨리 소멸되는 객체와, 오래 살아남는 객체를 구분하여 성능을 최적화함.

Young Generation

새롭게 생성된 객체가 위치하는 영역. 대부분의 객체는 짧은 생명 주기를 가지며, 빠르게 가비지로 처리됨.

Old Generation

Young Generation을 지나 오랫동안 참조되고 있는 객체가 위치하는 영역. 이 영역의 객체는 비교적 적은 빈도로 가비지 컬렉션됨.
이 방식은 Young Generation에서 빠르게 가비지 컬렉션을 수행하여, 성능을 높이는 데 유리함.

3. Stop-the-World

가비지 컬렉션 과정에서 프로그램 실행을 일시적으로 중단하는 방식임. 가비지 컬렉션이 진행되는 동안 다른 작업을 멈추고, 가비지 컬렉션이 완료된 후에 다시 실행을 재개함.

이 방식은 성능에 영향을 미칠 수 있으나, 최신 JVM이나 .NET 런타임에서는 가비지 컬렉션의 효율성을 높이기 위해 다양한 최적화 기법을 도입하고 있음.

4. Copying Collection

가비지 컬렉터는 메모리를 두 개의 영역으로 나누고, 사용되는 객체를 한 영역에서 다른 영역으로 복사함. 이 방식은 메모리 파편화를 방지하고, 성능을 높이는 데 도움이 됨.

객체를 복사할 때 사용되지 않는 메모리를 정리함.
더 이상 참조되지 않는 객체를 무시하고, 참조되는 객체만 복사함.

가비지 컬렉션이 성능에 미치는 영향

가비지 컬렉터는 자동 메모리 관리를 통해 프로그램의 안정성을 높이지만, 성능에 영향을 미칠 수 있음. 특히, Stop-the-World가 발생할 때, 프로그램이 일시 중단될 수 있음. 이를 최소화하기 위해 다양한 최적화 기법이 존재함.

최적화 기법

최신 JVM에서는 Concurrent Mark-Sweep (CMS), Garbage-First (G1) GC 등 다양한 가비지 컬렉션 방식이 도입되어, Stop-the-World 시간을 최소화하고 전체적인 성능을 개선함.

가비지 컬렉션이 발생하는 시점

가비지 컬렉터는 특정 주기나 이벤트에 따라 메모리 회수를 진행함. 메모리 부족이 발생하거나, 사용하지 않는 객체가 일정량 이상 누적되었을 때 가비지 컬렉션이 발생할 수 있음.

메모리 부족

새로운 객체를 생성할 공간이 부족할 때.

여유 시간

시스템이 비교적 유휴 상태일 때 가비지 컬렉션이 발생함.

프로그래머가 가비지 컬렉션에 미치는 영향

프로그래머는 가비지 컬렉터의 직접적인 호출이나 제어는 불가능하지만, 메모리 사용 방식을 최적화하여 가비지 컬렉션의 성능에 간접적으로 영향을 미칠 수 있음.

객체 재사용

불필요한 객체 생성 대신, 객체를 재사용하는 방식을 사용하여 가비지 컬렉션의 빈도를 줄일 수 있음.

메모리 관리 전략

큰 객체를 과도하게 생성하거나, 불필요하게 오래 사용하는 객체를 최소화함으로써 가비지 컬렉션의 효율을 높일 수 있음.

결론

가비지 컬렉터는 더 이상 참조되지 않는 객체를 자동으로 해제하여 메모리 누수를 방지하고, 프로그램의 안정성을 높이는 중요한 역할을 함. 프로그래머가 메모리 관리를 직접 수행할 필요 없이, 가비지 컬렉터가 이를 자동으로 처리함으로써 생산성을 높일 수 있음. 그러나, 가비지 컬렉션은 성능에 영향을 미칠 수 있으므로, 이를 최적화하기 위한 다양한 전략이 필요함.

profile
웹개발자 취업 준비생

0개의 댓글