선 조치 후 분석

[Java] Java 참조 유형 종류 본문

Language/Java

[Java] Java 참조 유형 종류

JB1104 2023. 11. 27. 11:00
728x90
반응형
SMALL

Java의 참조 유형에는 크게 4가지가 있다.

참조 유형에 따라GC 실행 대상 여부, 시점이 달라진다.

 

아래로 갈수록 CG의 대상이 되는 경우와 시점이 앞당겨진다.

  1. 강한 참조 (Strong Reference)
  2. 소프트 참조 (Soft Reference)
  3. 약한 참조 (Weak Reference)
  4. 팬텀 참조 (Phantom Reference)

1. 강한 참조 (Strong Reference)

  • Java의 기본 참조 유형
A obj = new A();

 

obj 변수가 참조를 가지고 있는 한, A 객체는 GC의 대상이 되지 않는다.


 

2. 소프트 참조 (Soft Reference)

public static void main(String[] args) {
    A obj = new A();

    SoftReference<A> sftObj = new SoftReference<A>(obj);

    // 이 시점에 GC의 실행 대상이 가능
    obj = null;

    // JVM의 메모리가 부족하지 않아 GC 실행 대상이 되지 않은경우
    // null이 반환되지 않고 기존 객체가 반환된다.
    obj = sftObj.get();
}

 

대상 객체를 참조하는 경우가 SoftReference 객체만 존재하는 경우 GC의 대상이 된다.

단, JVM 메모리가 부족한 경우에만 Heap 영역에서 제거되고 메모리가 부족하지 않다면 굳이 제거하지 않는다.

 

 


3. 약한 참조 (Weak Reference)

public static void main(String[] args) {       
    A obj = new A();

    WeakReference<A> weakObj = new WeakReference<A>(obj);

    // 이 시점에 GC의 실행 대상이 가능
    obj = null;

    //다음 GC 실행시 무조건 Heap 메모리에서 제거
    // 제거된 경우 null 반환
    obj = weakObj.get();
}

 

대상 객체를 참조하는 경우가 WeakReference 객체만 존재하는 경우 GC의 대상이 된다.

다음 GC 실행 시 무조건 Heap 메모리에서 제거된다.


4. 팬텀 참조 (Phantom Reference)

  • 가장 GC 대상이 될 확률이 높은 유형
public static void main(String[] args) {
    A obj = new A();

    ReferenceQueue<A> refObj = new ReferenceQueue<A>();

    PhantomReference<A> phantomObj = null;

    // 팬텀 참조는 아래처럼만 생성이 가능
    phantomObj = new PhantomReference<A>(obj,refObj);

    obj = null;

    System.gc();

    System.out.println("GC 실행 전");
    System.out.println(phantomObj.enqueue());
    System.out.println(phantomObj.get());
    System.gc();
    System.out.println("GC 실행 후");
    System.out.println(phantomObj.enqueue());
    System.out.println(phantomObj.get());
}

 

 

생성자에서 무조건 ReferenceQueue를 받는다. GC가 실행되기 전에 finalize() 호출 후 메모리에서 정리된다고 한다.

내부적으로는 ReferenceQueue에서 유지하고 있지만 GC가 수행되면 ReferenceQueue에서도 제거되는 거 같다.

또한, Phantom은 다른 참조 유형과 다르게 get 메서드를 통해 접근하게 되면 항상 null이 반환된다.

즉 접근을 할 수 없다는 것을 의미한다.

 

Phantom Reference는 잘 사용하지 않고, 어려운 개념이라 GC 대상이 될 확률이 가장 높은 참조 유형이라고만

알고 넘어가자.

728x90
반응형
LIST