오늘은 가비지 컬렉션에 대해 알아보겠습니다.
자바 코딩을 하면서 우리는 종종 변수를 만들고 메소드를 정의하지만, 사용하지 않는 경우도 많습니다. 다른 언어들, 특히 파이썬은 가비지 컬렉터가 없어서 개발자가 직접 메모리 관리를 해주어야 한다고 오해할 수 있습니다. 하지만 파이썬도 가비지 컬렉터를 사용하여 자동으로 메모리를 관리합니다. 파이썬은 참조 카운팅과 주기적인 가비지 컬렉션(순환 참조 처리)을 통해 불필요한 메모리를 회수합니다.
반면, 자바에서는 JVM(Java Virtual Machine)이 가비지 컬렉터를 관리합니다. 자바의 가비지 컬렉션은 개발자가 메모리를 직접 관리하지 않아도, 더 이상 참조되지 않는 객체들을 자동으로 감지하고 힙 영역에서 회수하여 메모리를 효율적으로 관리합니다. 즉, 자바에서는 불필요한 객체들이 가비지 컬렉터에 의해 자동으로 정리되므로 개발자가 신경 쓸 필요가 없습니다.
가비지 컬렉션 (Garbage Collection, GC)은 프로그래밍 언어에서 메모리 관리의 일환으로 사용되지 않는 객체나 데이터를 자동으로 삭제하는 기능을 말합니다. 이 기법은 주로 동적 메모리 할당이 있는 언어에서 사용되며, 개발자가 명시적으로 메모리를 해제하지 않아도 시스템이 불필요한 객체를 자동으로 정리하여 메모리 누수를 방지하는 역할을 합니다.
1. 가비지 컬렉션의 기본 원리
가비지 컬렉션의 목적은 사용되지 않는 메모리를 회수하는 것입니다. 객체가 더 이상 사용되지 않거나 참조되지 않으면, 이 객체는 가비지로 간주되어 메모리에서 해제됩니다. 이 과정을 통해 메모리 관리가 자동으로 이루어지며, 개발자는 수동으로 메모리를 관리하는 번거로움에서 벗어날 수 있습니다.
2. 가비지 컬렉션의 주요 개념
가비지 컬렉션은 여러 가지 방식으로 구현될 수 있습니다. 가장 대표적인 방식은 **참조 카운팅 (Reference Counting)**과 트라이-마크 (Tri-Color) 알고리즘입니다.
2.1 참조 카운팅 (Reference Counting)
- 객체가 생성될 때마다 해당 객체를 참조하는 변수나 객체의 개수를 카운트합니다.
- 참조 카운트가 0인 객체는 더 이상 사용되지 않으므로, 가비지 컬렉터가 이를 삭제합니다.
- 하지만 이 방식은 순환 참조(서로가 서로를 참조하는 경우)를 처리하는 데 한계가 있습니다.
2.2 트라이-마크 알고리즘 (Tri-Color Marking)
- 마크-스윕 (Mark-and-Sweep): 객체가 참조되는지를 검사한 후, 참조되지 않는 객체들을 제거합니다.
- 마크 단계: 모든 객체를 스캔하여 사용 중인 객체를 마킹합니다.
- 스윕 단계: 마킹되지 않은 객체를 메모리에서 해제합니다.
- 이 방식은 순환 참조도 처리할 수 있습니다.
2.3 세대별 가비지 컬렉션 (Generational Garbage Collection)
- 객체를 새로운 객체와 오래된 객체로 구분하여 다르게 처리하는 방식입니다.
- 대부분의 객체는 짧은 시간 동안만 사용되므로, 새로운 객체들만 자주 가비지 컬렉션을 적용하고, 오래된 객체들은 덜 자주 처리합니다. 이를 통해 효율성을 높일 수 있습니다.
- Young Generation과 Old Generation으로 나누어 가비지 컬렉션을 진행합니다.
3. 가비지 컬렉션이 중요한 이유
- 메모리 누수 방지: 객체가 더 이상 사용되지 않으면 자동으로 메모리가 회수되어, 메모리 누수가 발생하지 않도록 합니다.
- 개발자의 부담 경감: 개발자가 직접 메모리를 관리할 필요가 없으므로, 코드가 더 간결하고 유지보수하기 쉬워집니다.
- 자동화된 메모리 관리: 프로그램의 실행 중 메모리 관리가 자동으로 이루어져, 안정성이 높아집니다.
4. 자바에서의 가비지 컬렉션
자바에서는 JVM(Java Virtual Machine)이 가비지 컬렉션을 자동으로 관리합니다. 자바의 가비지 컬렉터는 객체가 더 이상 사용되지 않거나 참조되지 않으면 힙(Heap) 메모리에서 해당 객체를 제거합니다. 자바의 가비지 컬렉션은 여러 알고리즘을 사용하여 메모리 효율성을 최적화합니다. 자바에서는 가비지 컬렉션을 명시적으로 호출할 수 없으며, 자동으로 실행됩니다.
5. 가비지 컬렉션의 장점과 단점
장점:
- 메모리 관리의 자동화: 개발자가 메모리를 수동으로 관리할 필요가 없으므로 코드가 단순하고 안정적입니다.
- 메모리 누수 방지: 가비지 컬렉터가 사용하지 않는 객체를 정리하므로 메모리 누수가 발생하지 않습니다.
단점:
- 성능 문제: 가비지 컬렉션이 실행될 때 잠시 멈추는 정지 시간(Stop-The-World)이 발생할 수 있으며, 이는 성능에 영향을 줄 수 있습니다.
- 예측 불가능성: 가비지 컬렉션의 실행 시점이나 빈도를 개발자가 제어할 수 없으므로, 일부 경우 성능에 영향을 미칠 수 있습니다.
'JAVA' 카테고리의 다른 글
| [Java] Generics은 무엇이고 왜 사용할까? (0) | 2025.04.22 |
|---|---|
| [Java] 인터페이스를 사용하는 이유는 무엇일까? (0) | 2025.04.21 |
| [Java] Java 의 주요 특징 (2) | 2025.04.17 |
| [JDK | JRE] JDK 와 JRE 의 차이는 무엇일까? (2) | 2025.04.16 |
| [JAVA] 객체지향 언어 JAVA (0) | 2025.04.16 |