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

Java에서 가비지 컬렉터(GC)를 호출하는 2가지 방법

Java에서 가비지 컬렉션(Garbage Collection)은 가비지 컬렉터(Garbage Collector, GC)라고 불리는 데몬 스레드(daemon thread)에 의해 수행됩니다. JVM이 자동으로 GC를 실행해 줄 때까지 기다리는 대신, 개발자가 직접 JVM에 GC 실행을 요청할 수도 있습니다. 다만 이것은 어디까지나 '요청'일 뿐이며, JVM이 반드시 이를 수행한다는 보장은 없습니다.

Java에서는 크게 두 가지 방법으로 가비지 컬렉터 호출을 요청할 수 있습니다.

  • System 클래스를 이용하는 방법
  • Runtime 클래스를 이용하는 방법

1. System 클래스를 이용하는 방법

System 클래스에는 정적(static) 메서드인 gc()가 정의되어 있으며, 이 메서드를 호출하면 JVM에 가비지 컬렉터 실행을 요청합니다.

예제 코드

public class SystemClassTest {
    public static void main(String[] args) {
        SystemClassTest test = new SystemClassTest();
        test = null;
        System.gc();
    }

    public void finalize() {
        System.out.println("Garbage collected");
    }
}

실행 결과

Garbage collected

객체 참조를 null로 만들어 더 이상 참조되지 않게 한 후 System.gc()를 호출하면, GC가 해당 객체를 수거 대상으로 판단하고 finalize() 메서드가 실행된 것을 확인할 수 있습니다.

2. Runtime 클래스를 이용하는 방법

Runtime 클래스는 Java의 싱글턴(singleton) 클래스로, getRuntime() 메서드를 통해서만 런타임 객체를 얻을 수 있습니다. Runtime 클래스의 gc() 메서드는 인스턴스 메서드이기 때문에 반드시 런타임 객체를 먼저 가져온 후 호출해야 합니다.

예제 코드

public class RuntimeClassTest {
    public static void main(String[] args) {
        RuntimeClassTest test = new RuntimeClassTest();
        test = null;
        Runtime.getRuntime().gc();
    }

    public void finalize() {
        System.out.println("Garbage collected");
    }
}

실행 결과

Garbage collected

추가로 알아두면 좋은 점

  • System.gc()는 내부적으로 Runtime.getRuntime().gc()를 호출하는 편의 메서드입니다. 즉, 두 방법은 본질적으로 동일한 동작을 합니다.
  • finalize() 메서드는 Java 9부터 deprecated(사용 중단 권고)되었습니다. 리소스 해제가 필요하다면 try-with-resourcesCleaner 클래스를 사용하는 것이 권장됩니다.
  • GC 호출 요청은 보장되지 않으며, 임의로 호출하면 애플리케이션 성능에 부정적인 영향을 줄 수 있습니다. 필요하다면 JVM 옵션 -XX:+DisableExplicitGC를 통해 명시적 GC 호출을 비활성화할 수도 있습니다.