개발공부/CS

가비지 컬렉터란?

카슈밀 2025. 2. 16. 00:02
반응형

📌 가비지 컬렉터(Garbage Collector, GC)란?

 

**가비지 컬렉터(GC)**는 프로그래밍 언어에서 더 이상 사용되지 않는 메모리를 자동으로 정리해주는 기능.

➡️ 불필요한 객체를 자동으로 감지하고 메모리를 해제하는 역할을 해!

 

💡 쉽게 말해?

우리가 변수를 만들거나 객체를 생성하면 메모리가 할당돼.

그런데, 이 변수가 더 이상 필요 없을 때 우리가 직접 해제하지 않아도,

GC가 알아서 정리해 줌! 🧹✨

 

📌 가비지 컬렉션이 필요한 이유

 

프로그래밍에서 메모리 관리는 매우 중요해!

1️⃣ 메모리 누수 방지 → 사용되지 않는 객체가 계속 남아 있으면 메모리 부족 문제 발생!

2️⃣ 개발자가 직접 메모리 해제할 필요 없음 → C 언어처럼 free()를 호출하지 않아도 됨.

3️⃣ 코드 안정성 향상 → 잘못된 메모리 접근을 방지할 수 있음.

 

📌 가비지 컬렉터 동작 방식 (Mark and Sweep 알고리즘)

 

💡 대부분의 가비지 컬렉터는 Mark and Sweep 알고리즘을 사용해!

 

1️⃣ Mark (마킹 단계)

사용 중인 객체와 사용하지 않는 객체를 구분

참조되고 있는 객체는 **“살아 있음”**으로 표시

참조되지 않는 객체는 **“죽은 객체”**로 마킹

 

2️⃣ Sweep (정리 단계)

“죽은 객체”를 메모리에서 제거하여 해제된 메모리를 다시 사용 가능하게 만듦.

 

🛑 이 과정에서 잠깐 프로그램이 멈출 수도 있음 → 이를 “Stop-the-world” 라고 해.

➡️ 그래서 최신 GC 기술들은 Stop-the-world 시간을 줄이는 방향으로 발전 중!

 

📌 언어별 가비지 컬렉션 지원 여부

 

프로그래밍 언어 가비지 컬렉션 지원 설명

Java ✅ 지원 JVM(Java Virtual Machine)에서 GC 수행

C# ✅ 지원 .NET의 CLR(Common Language Runtime)에서 GC 수행

Python ✅ 지원 참조 카운트 + GC 모듈 사용

JavaScript ✅ 지원 V8 엔진에서 GC 수행 (Mark and Sweep)

C / C++ ❌ 미지원 개발자가 malloc() / free()로 직접 관리해야 함

 

📌 언어별 가비지 컬렉터 특징

 

✅ 1. Java (JVM의 GC)

Stop-the-world 현상이 발생할 수 있음.

대표적인 GC 종류

Serial GC → 단순하지만 멀티스레드 환경에서는 비효율적.

Parallel GC → 여러 개의 스레드가 GC 작업을 수행하여 속도 향상.

G1 GC → 최신 GC로, Stop-the-world 시간을 최소화.

 

✅ 2. JavaScript (V8 엔진의 GC)

V8 엔진(Google Chrome, Node.js)에서 실행됨.

Mark-and-Sweep 방식 사용.

생명 주기별 메모리 관리 (Minor GC & Major GC)

 

✅ 3. Python (GC + 참조 카운팅)

Python의 GC는 참조 카운트(Reference Counting) 기반

import gc로 수동 GC 실행 가능

 

import gc

gc.collect()  # 강제로 GC 실행

 

📌 가비지 컬렉터를 최적화하는 방법

 

불필요한 객체를 빨리 삭제

null 할당하여 참조 제거 (obj = null)

GC가 덜 실행되도록 메모리 관리

Java에서는 StringBuffer 사용 → 불필요한 객체 생성을 줄임.

메모리 누수 방지 (JavaScript의 setInterval 등 주의)

사용 후 clearInterval() 호출해야 GC가 실행됨.

객체 풀 사용 (Object Pooling)

자주 사용하는 객체는 재사용하여 메모리 낭비 줄이기.

 

📌 가비지 컬렉션 요약

 

GC는 사용하지 않는 메모리를 자동으로 정리하는 기능

Mark and Sweep 방식으로 동작

Java, Python, JavaScript는 GC 지원 / C, C++은 직접 관리 필요

GC를 최적화하려면 메모리 관리를 신경 써야 함

 

📌 이해됐어? 더 궁금한 거 있으면 질문해 줘! 😊🚀

728x90

'개발공부 > CS' 카테고리의 다른 글

추상화란?  (0) 2025.02.16
오버로딩(Overloading) vs. 오버라이딩(Overriding) 차이점  (0) 2025.02.16
Docker란?  (0) 2025.02.15
API란?  (0) 2025.02.15
TDD: 테스트 주도 개발.  (0) 2025.02.15