the source code에 따르면, PhantomReference 클래스를 사용합니다. 문서에 따라 :
콜렉터가 해당 지시 대상을 다른 방법으로 회수 할 수 있다고 판단한 후 대기열에 들어있는 팬텀 참조 오브젝트. 팬텀 참조는 Java finalization 메커니즘에서 가능한 것보다 더 유연한 방식으로 사전 상재 정리 작업을 예약하는 데 가장 자주 사용됩니다.
가비지 컬렉터가 팬텀 레퍼런스의 지시 대상이 팬텀 도달 가능이라고 판단한 특정 시점을 결정하면 그 시점 또는 그 이후에 참조를 대기열에 추가합니다.
재 확보 가능한 객체가 그대로 유지되도록 팬텀 참조의 대상을 검색하지 못할 수 있습니다. 팬텀 참조의 get 메소드는 항상 null을 반환합니다.
약한 참조와 달리 팬텀 참조는 대기열에 들어갈 때 가비지 수집기에서 자동으로 지워지지 않습니다. 가상 참조를 통해 도달 할 수있는 객체는 그러한 참조가 모두 지워지거나 스스로 도달 할 수 없을 때까지 그대로 유지됩니다. - 새로운 팬텀 참조
q
참조하는 오브젝트 - 참조 등록한 경우 나, 널 될되는 큐
referent
:
PhantomReference
생성자 개의 인수를 받아 등록이 필요하지 않습니다.
q
인수는 ance of the ReferenceQueue
클래스입니다. 이 ReferenceQueue
에 PhantomReference
이 추가되면 referent
이 팬텀 도달 가능 상태가됩니다. 이 경우 ReferenceQueue
클래스의 poll()
또는 remove()
메서드를 사용하여 PhantomReference
을 검색 할 수 있습니다. 예를 들어
:
T objectToWatch = ...;
ReferenceQueue<T> referenceQueue = new ReferenceQueue<T>();
new PhantomReference<T>(objectToWatch, referenceQueue);
// Later on, probably in another thread...
Reference<? extends T> nextReference = referenceQueue.remove();
// Tidy up!
참고 : PhantomReference
도 사용 될 수 있습니다 SoftReference
및 WeakReference
라는 이름의 형제 클래스가 있습니다. 이들 사이의 관계는 java.lang.ref package documentation에 설명되어 있습니다.
이러한 목적으로는 파이널 라이저를 사용하지 마십시오. 피할 수있는 경우 파이널 라이저를 사용하지 마십시오. finalize() 메서드가 가비지 수집 다음에 즉시 호출되거나 전혀 호출되지 않는다고 보장 할 수 없습니다 (Effective Java 2nd Ed, Item 7 참조). java.lang.ref 패키지를 사용하십시오. – Leigh
도움이 될 경우 파이널 라이저를 사용하지 마십시오! http://stackoverflow.com/a/158791/74694 –