📌 가비지 컬렉터(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를 최적화하려면 메모리 관리를 신경 써야 함
📌 이해됐어? 더 궁금한 거 있으면 질문해 줘! 😊🚀
'개발공부 > 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 |