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-resources나Cleaner클래스를 사용하는 것이 권장됩니다.- GC 호출 요청은 보장되지 않으며, 임의로 호출하면 애플리케이션 성능에 부정적인 영향을 줄 수 있습니다. 필요하다면 JVM 옵션
-XX:+DisableExplicitGC를 통해 명시적 GC 호출을 비활성화할 수도 있습니다.