자바에서 PhantomReference에 대해 약간의 혼란을 겪고 있습니다. 필자가 온라인 기사를 살펴본 결과, PhantomReference 객체가 참조에서 get()을 호출하고 PhantomReference 객체가 PhantomReference가 제거되었을 때 ReferenceQueue에 삽입된다는 사실을 언급하더라도 PhantomReference 객체가 생성 후 null을 반환한다고 언급했다. 기억.PhantomReference와 ReferenceQueue 사이의 관계는 무엇입니까?
다음 코드 예제를 시도했지만 그 결과에 혼란이 있습니다.
Equipment equipment = new Equipment();
ReferenceQueue queue = new ReferenceQueue();
PhantomReference pr = new PhantomReference(equipment, queue);
System.out.println(pr.get());
System.out.println(queue.poll());
위의 두 명령문은 null을 출력합니다. pr.get()이 null을 반환하면 pr에 의해 참조 된 객체가 가비지 수집되는 것을 의미합니까? 그렇다면 개체가 여전히 우선 순위 큐에 추가되지 않은 이유는 무엇입니까?
누구든지이 문제를 명확히 설명 할 수 있습니까? PhantomReference와 ReferenceQueue에 대한 나의 이해가 잘못 되었다면 사과드립니다.
은 단순히뿐만 아니라덕분에 많은
답변을 주셔서 감사 드리며 상황을 명확하게 이해하는 데 도움이되었지만 System.gc()를 호출하는 이유를 알고 싶습니다. 그리고 나서 queue.remove()를 호출하십시오. 설명해 주시겠습니까 – Dilan
@ user3115189'System.gc()'는 가능한 모든 것을 가비지 수집기로 가비지 수집기에 _suggestion_합니다. 가비지 수집되는 '장비'객체를 볼 기회가 더 많습니다. 대기열.remove()'는'poll()'대신에 호출된다. 왜냐하면 대기열에서 엔트리를 기다리는 것을 차단하기 때문이다. 내 대답은 javadoc에서 따옴표를 참조하십시오. 가상 참조는 ** ** 나중에 ** 대기열에 추가 될 수 있습니다. 우리는 그 일이 일어날 때까지 기다리고 싶다. –
고맙습니다. – Dilan