Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 객체를 GC(가비지 컬렉션) 대상으로 만드는 방법 총정리

참조되지 않는 객체를 제거하는 과정을 가비지 컬렉션(Garbage Collection, GC)이라고 합니다. 객체가 더 이상 참조되지 않으면 사용되지 않는 객체로 간주되며, JVM이 자동으로 해당 객체를 소멸시킵니다.

그렇다면 객체를 GC 대상으로 만드는 방법에는 어떤 것들이 있을까요? 대표적인 두 가지 방법을 살펴보겠습니다.

1. 참조 변수에 null 할당하기

객체 생성의 목적이 달성되었다면, 해당 객체를 참조하는 모든 참조 변수에 null을 할당할 수 있습니다. 참조가 끊어진 객체는 더 이상 접근할 수 없으므로 GC의 수거 대상이 됩니다.

예제 코드

public class GCTest1 {
    public static void main(String [] args){
        String str = "Welcome to TutorialsPoint"; // str 변수가 참조하는 String 객체는 아직 GC 대상이 아님
        str = null; // str 변수가 참조하던 String 객체가 GC 대상이 됨
        System.out.println("str eligible for GC: " + str);
    }
}

실행 결과

str eligible for GC: null

위 예제에서 str = null; 문장이 실행되는 순간, 원래 "Welcome to TutorialsPoint" 문자열 객체를 가리키던 참조가 사라지므로 해당 객체는 GC 후보가 됩니다.

2. 참조 변수를 다른 객체에 재할당하기

참조 변수가 기존 객체와의 연결을 끊고 다른 객체를 가리키도록 재할당할 수도 있습니다. 이 경우 재할당 이전에 참조하던 객체는 더 이상 참조되지 않으므로 GC 대상이 됩니다.

예제 코드

public class GCTest2 {
    public static void main(String [] args){
        String str1 = "Welcome to TutorialsPoint";
        String str2 = "Welcome to Tutorix"; // str1과 str2가 각각 참조 중이므로 아직 GC 대상이 아님
        str1 = str2; // str1이 참조하던 String 객체가 GC 대상이 됨
        System.out.println("str1: " + str1);
    }
}

실행 결과

str1: Welcome to Tutorix

str1 = str2;가 실행되면 str1은 "Welcome to Tutorix" 객체를 가리키게 되고, 기존에 str1이 참조하던 "Welcome to TutorialsPoint" 객체는 참조를 잃어 GC의 수거 대상이 됩니다.

정리

객체를 GC 대상으로 만드는 핵심은 해당 객체를 참조하는 모든 참조를 제거하는 것입니다. 참조 변수에 null을 할당하거나 다른 객체로 재할당하는 방법 외에도, 메서드 실행 종료 시 지역 변수의 참조가 자동으로 해제되는 경우나 컬렉션에서 객체를 제거(remove)하는 경우 등도 GC 대상화에 포함됩니다. 단, 객체가 GC 대상이 된다고 해서 즉시 소멸되는 것은 아니며, 실제 회수 시점은 JVM의 가비지 컬렉터가 결정한다는 점을 기억해야 합니다.