정의
Java의 Garbage Collector(이하, GC)는 C의 malloc()과 free()처럼 개발자가 직접 메모리를 할당하고 해제할 필요 없이 사용하지 않는 메모리 영역을 자동으로 해제하여 메모리 누수(memory leak)를 방지합니다.
유형
JVM의 heap 영역은 처음 설계될 때 다음을 전제로 설계되었습니다.
- 대부분의 객체는 금방 접근 불가능한 상태(Unreachable)가 됩니다.
- 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재합니다.
즉, 객체는 대부분 일회성이며, 메모리에 오랫동안 남아있는 경우가 드뭅니다.
객체의 생존 기간에 따라 물리적인 heap 영역을 나눴고 Young과 Old의 2가지 영역으로 설계되었습니다.
- Young 영역
- 새롭게 객체가 할당되는 영역
- 대부분의 객체가 금방 접근 불가 상태가 되기 때문에, 많은 객체가 생성되었다가 사라집니다.
- Young 영역에 대한 GC를 Minor GC라고 부릅니다.
- Old 영역
- Young 영역에서 접근 가능 상태를 유지하여 살아남은 객체가 복사되는 영역
- Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생합니다.
- Old 영역에 대한 GC를 Major GC라고 부릅니다.
※ Old 영역이 Young 영역보다 크게 할당되는 이유는 Young 영역의 수명이 짧은 객체들은 큰 공간을 필요로 하지 않으며, 큰 객체들은 바로 Old 영역에 할당되기 때문입니다.
동작 원리
- Mark-and-Sweep : 메모리를 훑으면서 필요한 것들만 마킹하여 마킹되지 않는 것은 전부 해제해버립니다.
- Referece Counting : 한 요소가 다른 요소를 참조하고 있는 횟수를 세어 그 값이 0이 되면 메모리를 해제합니다.(이 경우, 순환 참조를 사용하면 안 됩니다.)
장점
- 개발자를 수동적인 메모리 할당/해제로부터 해방시킨다!!!!
단점
- 실행 조건이 일정치 않아 GC의 메커니즘을 이해하고 예측하여 코드를 정리할 필요가 있습니다.
- Mark-and-Sweep의 경우 애플리케이션 실행을 멈추는 stop-the-world가 존재하기 때문에 GC 성능 개선을 위한 튜닝을 한다고 하면 해당 소요 시간을 줄이는 작업을 의미합니다.
Q. 가비지 컬렉터(Garbage Collector)는 무엇이며, 어떻게 작동하나요?
가비지 컬렉터는 메모리 관리를 위해 사용되며, 동적으로 할당된 메모리 중 더 이상 사용되지 않는 메모리인 가비지를 식별하고 제거합니다. 이는 자동으로 이뤄지며, 주요 작동 원리는 접근 가능한 객체를 식별하여 접근 불가능한 객체들만을 메모리에서 해제하는 것입니다. 접근 불가 여부를 판단하기 위한 방법으로는 각 요소의 다른 요소에 대한 참조 횟수를 감지하여 0인 경우 제거하는 reference counting과 더 이상 사용되지 않는 요소들을 전부 해제하는 Mark-and-Sweep이 있습니다.
일반적으로 가비지 컬렉터는 메모리 누수를 방지하고 프로그램 실행 중에 메모리 관리를 용이하게 합니다. 또한 개발자가 직접 메모리 관리를 수행하지 않아도 되어 더욱 안정적이고 효율적인 코드 작성을 돕습니다.
참고 출처:
- [Java] Garbage Collection(가비지 컬렉션)의 개념 및 동작 원리 (1/2)
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] OOP의 4가지 특징 (0) | 2024.01.23 |
---|---|
[Java] 자바 접근 제어자의 유형과 특징 (0) | 2024.01.22 |
[Java] String vs. StringBuilder vs. StringBuffer 차이 (0) | 2024.01.18 |
[Java] 자바의 컴파일 과정 & JVM 메모리 구조 (0) | 2024.01.17 |
[Java] JRE & JDK & JVM (0) | 2023.10.17 |