2025-08-31 11:33
Tags: 소프트웨어 공학
가비지 컬렉션
-
사용하지 않는 메모리를 자동으로 정리해주는 청소
-
‘Root’에서 시작해 살아있는 객체를 표시(Mark)하고, 표시되지 않은 쓰레기 객체들을 치우는(Sweep) 방식으로 동작
-
기존 C 나 C++ 같은 언어에서는 메모리를 수동으로 할당하고 해제해야 했다.
-
이는 개발자에게 완벽한 메모리 통제권을 준다는 장점이 있지만 제대로 다루지 못하면 성능적으로나 보안적으로 매우 위험한 양날의 검
- 메모리 누수 (Memory Leak): 사용이 끝난 메모리를 해제하지 않아 메모리가 계속 쌓이는 문제. 프로그램이 오래 실행될수록 가용 메모리가 줄어들어 결국 시스템 전체가 느려지거나 멈출 수 있다. (도서관에서 책을 빌리고 반납하지 않는 상황)
- 댕글링 포인터 (Dangling Pointer): 이미 해제된 메모리 주소를 계속 참조하고 있는 경우. 해당 주소에 새로운 데이터가 할당되면, 의도치 않은 값을 읽거나 써서 프로그램이 비정상적으로 종료될 수 있다. (반납한 책이 있던 자리를 계속 찾아가는 상황)
- 이중 해제 (Double Free): 이미 해제한 메모리를 또다시 해제하려고 시도하는 문제. (반납한 책을 또 반납하려는 상황)
-
가비지 컬렉션 은 루트에서 시작해 연결된 모든 객체를 방문 → 만나면 살아있는거 표시(Mark) 못만나면 쓰레기 → 쓰레기 청소(Sweep/Compact/Copy)
알고리즘 종류 | 동작 방식 | 장점 | 단점 |
---|---|---|---|
Mark-and-Sweep | 살아있는 객체를 표시하고, 나머지를 제거 | 순환 참조 해결, 기본적 | Stop-the-World, 메모리 파편화 |
Mark-and-Compact | 살아있는 객체를 표시하고, 한쪽으로 압축 | 파편화 해결, 메모리 효율 향상 | 객체 이동 비용 발생 |
Copying | 힙을 둘로 나눠 살아있는 객체만 복사 | 매우 빠름, 파편화 없음 | 메모리 사용 효율이 절반으로 감소 |
Generational | 객체 수명에 따라 영역을 나누어 관리 | 전체적인 GC 성능 및 효율성 극대화 | 구조가 상대적으로 복잡함 |