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

자바의 고립 섬(Island of Isolation) 완벽 이해하기

가비지 컬렉션과 객체 소멸

자바에서 객체는 사용이 끝나면 가비지 컬렉터(Garbage Collector)에 의해 메모리에서 자동으로 해제됩니다. 가비지 컬렉터는 더 이상 해당 객체를 참조하는 참조 변수가 존재하지 않는다고 판단되면 객체를 소멸시키며, 이때 소멸 대상 객체의 finalize() 메서드를 호출합니다.

고립 섬(Island of Isolation)이란?

두 객체 ab가 서로를 참조하고 있지만, 외부의 다른 어떤 객체도 이들을 참조하지 않는 상태를 '고립 섬'이라고 합니다. 즉, 고립 섬은 서로를 참조하는 객체들의 그룹이면서, 애플리케이션 내 다른 객체로부터는 전혀 참조되지 않는 집합을 의미합니다.

참고: 참조되지 않는 단일 객체 하나만 존재하더라도 이 역시 고립 섬으로 간주됩니다.

그럼 실제 예제를 통해 확인해 보겠습니다.

예제 코드

public class Demo{
   Demo i;
   public static void main(String[] args){
      Demo my_ob_1 = new Demo();
      System.out.println("Demo object one has been created");
      Demo my_ob_2 = new Demo();
      System.out.println("Demo object two has been created");
      my_ob_1.i = my_ob_2;
      my_ob_2.i = my_ob_1;
      my_ob_1 = null;
      my_ob_2 = null;
      System.gc();
   }
   @Override
   protected void finalize() throws Throwable{
      System.out.println("The finalize method has been called on the object");
   }
}

실행 결과

Demo object one has been created
Demo object two has been created
The finalize method has been called on the object
The finalize method has been called on the object

코드 분석

Demo라는 클래스 안에 main 메서드가 정의되어 있으며, 이 클래스에는 Demo 타입의 인스턴스 변수 i가 선언되어 있습니다. 실행 흐름은 다음과 같습니다.

my_ob_1my_ob_2라는 두 개의 Demo 객체가 생성된 후, 첫 번째 객체의 인스턴스 변수 i에 두 번째 객체가 할당되고, 반대로 두 번째 객체의 i에는 첫 번째 객체가 할당됩니다. 이렇게 두 객체는 서로를 참조하는 구조가 됩니다.

이후 두 참조 변수 모두 null로 설정하고 System.gc()를 호출하여 가비지 컬렉션을 명시적으로 요청합니다. 외부에서 두 객체를 가리키는 참조가 사라졌기 때문에, 서로를 참조하고 있음에도 불구하고 두 객체는 고립 섬을 형성하게 되며, 가비지 컬렉터의 수거 대상이 됩니다.

마지막으로 finalize() 메서드를 오버라이드하여 객체가 소멸될 때마다 메시지가 출력되도록 했으며, 실행 결과에서 두 객체 각각에 대해 finalize 메서드가 호출된 것을 확인할 수 있습니다. 이는 자바의 가비지 컬렉터가 순환 참조(circular reference) 상태에 있는 고립 섬 객체들을 정확히 감지하고 메모리에서 회수한다는 것을 보여줍니다.