我终于可以检查Hotspot JVM源代码,并找到以下代码。
在referenceProcessor.cpp中:
void ReferenceProcessor::process_discovered_references( BoolObjectClosure*is_alive, OopClosure* keep_alive, VoidClosure* complete_gc, AbstractRefProcTaskExecutor* task_executor) { NOT_PRODUCT(verify_ok_to_handle_reflists()); assert(!enqueuing_is_done(), "If here enqueuing should not be complete"); // Stop treating discovered references specially. disable_discovery(); bool trace_time = PrintGCDetails && PrintReferenceGC; // Soft references { TraceTime tt("SoftReference", trace_time, false, gclog_or_tty); process_discovered_reflist(_discoveredSoftRefs, _current_soft_ref_policy, true, is_alive, keep_alive, complete_gc, task_executor); } update_soft_ref_master_clock(); // Weak references { TraceTime tt("WeakReference", trace_time, false, gclog_or_tty); process_discovered_reflist(_discoveredWeakRefs, NULL, true, is_alive, keep_alive, complete_gc, task_executor); }函数process_discovered_reflist具有以下签名:
voidReferenceProcessor::process_discovered_reflist( DiscoveredList refs_lists[], ReferencePolicy* policy, bool clear_referent, BoolObjectClosure*is_alive, OopClosure* keep_alive, VoidClosure* complete_gc, AbstractRefProcTaskExecutor* task_executor)
这表明WeakRefs被ReferenceProcessor :: process_discovered_references无条件清除。
在Hotspot代码中搜索process_discovered_reference会显示CMS收集器(这是我正在使用的)从以下调用堆栈中调用此方法。
CMSCollector::refProcessingWorkCMSCollector::checkpointRootsFinalWorkCMSCollector::checkpointRootsFinal
每次运行CMS集合时,都将调用此调用堆栈。
假设这是真的,那么对长期存在的弱引用对象的唯一解释将是微妙的JVM错误或GC是否尚未运行。



