2009-08-04 5 views
5

의 쓰레기 수거 기다린이 발견 : 난 그냥 평민-IO 라이브러리에 주위 파고 된 특정 개체

 
Keeps track of files awaiting deletion, and deletes them when 
an associated marker object is reclaimed by the garbage collector. 

FileCleaningTracker 개체에 대한 문서에서 찾을 수 있습니다.

이제 어떻게 혼자서이 작업을 수행 할 수 있는지 궁금합니다. 가비지 수집기에서 객체를 회수 할 때 내 코드가 어떻게 감지합니까?

답변

9

the source code에 따르면, PhantomReference 클래스를 사용합니다. 문서에 따라 :

콜렉터가 해당 지시 대상을 다른 방법으로 회수 할 수 있다고 판단한 후 대기열에 들어있는 팬텀 참조 오브젝트. 팬텀 참조는 Java finalization 메커니즘에서 가능한 것보다 더 유연한 방식으로 사전 상재 정리 작업을 예약하는 데 가장 자주 사용됩니다.

가비지 컬렉터가 팬텀 레퍼런스의 지시 대상이 팬텀 도달 가능이라고 판단한 특정 시점을 결정하면 그 시점 또는 그 이후에 참조를 대기열에 추가합니다.

재 확보 가능한 객체가 그대로 유지되도록 팬텀 참조의 대상을 검색하지 못할 수 있습니다. 팬텀 참조의 get 메소드는 항상 null을 반환합니다.

약한 참조와 달리 팬텀 참조는 대기열에 들어갈 때 가비지 수집기에서 자동으로 지워지지 않습니다. 가상 참조를 통해 도달 할 수있는 객체는 그러한 참조가 모두 지워지거나 스스로 도달 할 수 없을 때까지 그대로 유지됩니다. - 새로운 팬텀 참조

q 참조하는 오브젝트 - 참조 등록한 경우 나, 널 될되는 큐

referent :

PhantomReference 생성자 개의 인수를 받아 등록이 필요하지 않습니다.

q 인수는 ance of the ReferenceQueue 클래스입니다. 이 ReferenceQueuePhantomReference이 추가되면 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도 사용 될 수 있습니다 SoftReferenceWeakReference라는 이름의 형제 클래스가 있습니다. 이들 사이의 관계는 java.lang.ref package documentation에 설명되어 있습니다.

1

정말이 질문에 대한 답변을 모르겠지만 개체의 finalize() 메서드는 리소스를 회수하기 전에 호출됩니다.

편집 : 다른 사람에게 메시지를 보내서 경고를하거나 그 선을 따라 메시지를 보낼 수 있습니다.

+4

이러한 목적으로는 파이널 라이저를 사용하지 마십시오. 피할 수있는 경우 파이널 라이저를 사용하지 마십시오. finalize() 메서드가 가비지 수집 다음에 즉시 호출되거나 전혀 호출되지 않는다고 보장 할 수 없습니다 (Effective Java 2nd Ed, Item 7 참조). java.lang.ref 패키지를 사용하십시오. – Leigh

+0

도움이 될 경우 파이널 라이저를 사용하지 마십시오! http://stackoverflow.com/a/158791/74694 –

관련 문제