Java 가비지 컬렉션 이해하기: 작동 원리와 중요성
Java 가비지 컬렉션이란?
Java의 가비지 컬렉터(GC)는 메모리를 자동으로 관리하여 개발자가 수동으로 메모리를 해제할 필요가 없게 해줍니다. 객체에 살아 있는 참조가 없으면 GC가 힙 공간을 회수하여, 그렇지 않으면 애플리케이션을 다운시킬 수 있는 메모리 누수를 방지합니다.
Java에서 객체는 new 연산자를 통해 힙에 생성됩니다. 런타임은 참조를 추적하며, 마지막 참조가 사라지면 객체는 수거 대상이 됩니다. GC는 백그라운드에서 주기적으로 실행되어 코드를 더 단순하고 안전하게 만듭니다.
C언어에서 free()가 필요한 것과 달리, Java는 댕글링 포인터와 미정의 동작의 위험을 제거하여 신뢰성과 보안을 강화합니다.
Java의 모든 객체는 메모리의 힙(heap) 영역에 존재하며, 이 영역을 GC가 스캔합니다.
실습 예제: GC 작동 관찰하기
1단계 – 아래 코드를 에디터에 복사:
class Student {
int a;
int b;
public void setData(int c, int d) {
a = c;
b = d;
}
public void showData() {
System.out.println("Value of a = " + a);
System.out.println("Value of b = " + b);
}
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student();
s1.setData(1, 2);
s2.setData(3, 4);
s1.showData();
s2.showData();
// Student s3;
// s3 = s2;
// s3.showData();
// s2 = null;
// s3.showData();
// s3 = null;
// s3.showData();
}
}
2단계 – 프로그램을 컴파일하고 실행. 처음에는 두 개의 Student 객체와 두 개의 참조 변수가 생성됩니다. 아래 다이어그램을 참조하세요.

3단계 – 20~22번 줄의 주석을 해제하고 다시 실행. 이제 s3가 s2와 같은 객체를 가리킵니다. 다이어그램은 두 참조가 하나의 객체를 공유함을 보여줍니다.

4단계 – 23~24번 줄 주석 해제. s2를 null로 설정하면 s3만 유일한 참조로 남아 객체는 여전히 살아 있습니다.

5단계 – 25~26번 줄 주석 해제. s2와 s3 모두 null이 되면 객체는 GC 대상이 됩니다. 마지막 다이어그램이 이 상태를 보여줍니다.

객체를 수거 대상으로 만들기
- 참조 변수에
null을 할당. GC가 실행되면 메모리를 회수합니다.
- 기본 타입(
int, double 등)은 객체가 아니며 null이 될 수 없습니다.

참고: 명시적 파이널라이저는 권장하지 않으며, GC에 맡기는 것이 좋습니다.