1. 가비지 컬렉션 이란?
가비지 컬렉션은 프로그램이 동적으로 사용하는 메모리를 관리하는 일종의 "청소 서비스"이다.
프로그램이 동적으로 메모리를 사용하다가 더 이상 필요 없는 부분이 생기면, 가비지 컬렉션은
그 부분을 찾아내서 정리해주는 역할을 한다.
* 자바에서 메모리 관리를 자동으로 처리하는 기능. (heap 메모리를 JVM이 자동으로 관리해준다.) * 자바가 한가할 때 가비지 컬렉션이 실행된다. = 가비지 컬렉터가 수행되면, 가비지 컬렉터를 제외한 나머지 자바 어플리케이션은 모든 동작을 멈춘다. = 느림
2. 가비지 컬렉션이 필요한 이유
가비지 컬렉션은 개발자가 메모리 관리를 수동으로 처리하는 것이 복잡하고 오류가 발생하기 쉬운
상황을 해결하기 위해 도입된 기능이다.
하지만 특정한 상황에서는 모든 메모리를 수동적으로 관리하는 것이 메모리의 효율성을 높일 수 있
으므로 이러한 경우에는 가비지 컬렉션의 자동 메모리 관리가 약점이 될 수 있습니다.
3. 가비지 컬렉션 원리
자바에서는 객체를 생성하는 연산자는 있지만 , 객체를 삭제하는 연산자는 없다.
다른 언어에서는 이렇게 메모리를 할당 받은 객체들을 프로그래머가 삭제까지 책임져야되기도 한다.
사실 개발자가 자신이 할당 받은 동적 메모리를 기억하고 있다가 사용이 끝나면 반환하는 것은 상당
히 번거로운 일이다. 따라서 자동으로 관리해주는 자바의 이 기능이 장점이 된다.
모든 가비지 컬렉션은 자동으로 이루어진다.
그럼 가비지 컬렉션은 객체가 사용되지 않는 지 어떻게 판단하는 것일까??
아래 코드를 한 번 살펴보자.
String a = new String(); String b = new String(); a = b;
코드를 보면 이러한 원리로 실행 된다.
- 객체 생성
프로그램이 실행되면서 필요한 정보를 담은 객체들이 메모리에 만들어집니다.
- 객체 사용
프로그램이 그 객체들을 사용하고 참조합니다.
- 객체 불필요
어떤 객체는 더 이상 필요하지 않게 되면, 가비지 컬렉션은 이 객체를 찾아냅니다.
- 자동 정리
가비지 컬렉션은 필요없는 객체들을 찾아내고 메모리에서 자동으로 정리합니다.
여기서 가비지 컬렉션은 어디서 발생 될까?
어떤 객체가 가비지 컬렉션의 후보에 올라왔는지 보이는가?
b가 a에 대입 될때 a의 참조 주소 값이 b에 할당 되면서 b 와 a는 같은 객체를 가리키게 되면서 기존
a를 가리키는 참조 변수가 사라졌으므로 a 는 가비지 컬렉션의 후보에 올라 왔다.
그림을 통해 다시 살펴보자.
가비지 콜렉션의 후보에 올라오게 되는 조건

a = b; (b가 a에 대입 될때) 일때 b의 참조 변수가 a로 복사 되면서 같은 땅인 49번지를 가리키게 되었고 64번지를 참조하는 변수가 사라지게 된 것이다.
변수가 참조를 해제한 객체는 가비지 컬렉션의 대상이 된다.
이렇게 어떤 변수도 참조하지 않는 객체를 JVM에서는 자동으로 collecting을 하고 시스템이 한가할 때 또는 힙 메모리가 부족해 질때 Garbage Collecting을 하게 되는 것이다.
가비지 콜렉션의 활동 절차

위에 그림에서와 같이 첫 번째 단계에서 참조되지 않은 객체가 식별되고 가비지 수집 준비가 된것으로 표시가 된다. 두 번째 단계에서는 표시가 된 객체들이 삭제가 된다. 그 후 가비지 컬렉터가 메모리를 압축을 하여 남는 공간에 새 객체를 순차적으로 할당할 수 있게 해준다.
4. Managed언어 vs Unmanaged언어
자바, C# - 매니지드 언어(Managed Language)
: 가비지 컬렉션(Garbage Collection)과 같은 자동 메모리 관리 기능을 제공하는 언어
사용하지 않는 객체(인스턴스)를 자동으로 감지하고, 해당 객체가 차지하고 있는 메모리를
자동으로 해제한다. 이를 통해 개발자는 직접 메모리 관리에 신경을 쓰지 않아도 되므로,
프로그래밍의 편의성과 안정성을 높일 수 있다.
C, C++ - 언매니지드 언어(Unmanaged Language)
: 개발자가 직접 가비지 컬렉션을 관리해야 한다. 더 세밀한 조정(내가 원할 때 삭제 가능)이
가능하다는 장점이 있지만, 메모리 관리에 대한 책임이 개발자에게 있으므로 실수에 따른
오류가 발생. (삭제하는 코드를 사용)
매니지드 언어 하나랑 언매니지드 언어 하나씩 할 수 있어야 한다.
Share article