栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java弱引用寿命长

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java弱引用寿命长

我终于可以检查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是否尚未运行。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/407298.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号