不管是弱引用还是其他引用类型,将字段referent置null的操作都发生在process_phase3中,而具体行为是由clear_referent的值决定的。而clear_referent的值则和引用类型相关。-济南达内培训负责整理
    ReferenceProcessorStats ReferenceProcessor::process_discovered_references(
    BoolObjectClosure* is_alive,
    OopClosure* keep_alive,
    VoidClosure* complete_gc,
    AbstractRefProcTaskExecutor* task_executor,
    GCTimer* gc_timer) {
    NOT_PRODUCT(verify_ok_to_handle_reflists());
    …
    //process_discovered_reflist方法的第3个字段就是clear_referent
    // Soft references
    size_t soft_count = 0;
    {
    GCTraceTime tt(“SoftReference”, trace_time, false, gc_timer);
	    可以看到,对于Soft references和Weak references clear_referent字段传入的都是true,这也符合我们的预期:对象不可达后,引用字段就会被置为null,然后对象就会被回收(对于软引用来说,如果内存足够的话,在Phase 1,相关的引用就会从refs_list中被移除,到Phase 3时refs_list为空集合)。
	
    但对于Final references和 Phantom references,clear_referent字段传入的是false,也就意味着被这两种引用类型引用的对象,如果没有其他额外处理,只要Reference对象还存活,那引用的对象是不会被回收的。Final references和对象是否重写了finalize方法有关,不在本文分析范围之内,我们接下来看看Phantom references.
    PhantomReference
    public class PhantomReference<T> extends Reference<T> {
    public T get() {
    return null;
    }
    public PhantomReference(T referent, ReferenceQueue<? super T> q) {
    super(referent, q);
    }
    }
    可以看到虚引用的get方法永远返回null,我们看个demo.
    public static void demo() throws InterruptedException {
    Object obj = new Object();
    ReferenceQueue<Object> refQueue =new ReferenceQueue<>();
    PhantomReference<Object> phanRef =new PhantomReference<>(obj, refQueue);
    Object objg = phanRef.get();
    //这里拿到的是null
    以上就是济南达内培训给大家做的内容详解,更多关于IT的学习,请继续关注济南达内培训