在Java中使用弱引用的成本

Ste*_*n C 46 java garbage-collection weak-references

有没有人研究过创建和垃圾收集Java WeakReference对象所涉及的运行时成本?多线程应用程序是否存在任何性能问题(例如争用)?

编辑:显然,实际答案将取决于JVM,但也欢迎一般观察.

编辑2:如果有人对性能做了一些基准测试,或者可以指出一些基准测试结果,那将是理想的.(对不起,但赏金已过期......)

Vit*_*aly 13

WeakReferences对CMS垃圾收集器有负面影响.据我所知,从服务器的行为来看,它会影响并行备注阶段时间.在此阶段,所有应用程序线程都会停止,因此这是非常不受欢迎的事情.所以你需要小心WeakReferences.

  • 维塔利,你现在还有这个吗?如果您在Sun论坛上发现了一些信息,您可以发布链接吗?谢谢! (2认同)

Arc*_*hie 5

我实现了一次Java垃圾收集器,所以无论我能做什么都是可能的(弱:)下限.

在我的实现中,在垃圾收集期间访问每个弱引用时,会有一小部分额外的开销.

所以结果是:我不担心它,除非你使用数以万计的弱引用,否则这不是一个大问题.

最重要的是,成本与存在的弱引用数量成正比,而不是整个堆的大小.

但是,这并不是说支持弱引用的垃圾收集器将与不支持弱引用的垃圾收集器一样快.这里推测的问题是,鉴于Java支持弱引用,使用它们的增量成本是多少?

我的是一个简单的"停止世界"标记/扫除垃圾收集器.在垃圾收集期间,它会确定每个对象是否存在该对象,并LIVE在对象标头中设置一个位.然后它通过并释放所有非活动对象.

要处理弱引用,只需添加以下内容:

  • 设置LIVE位时忽略弱引用(即,它们不会导致LIVE引用对象上的位被设置).
  • 在扫描步骤中,按如下方式添加一个特殊检查:如果您正在访问的对象是LIVE,并且它是a WeakReference,则检查它弱引用的对象,如果该对象不是LIVE,则清除该引用.

这种逻辑的微小变化适用于软和幻像参考.

如果你真的很好奇,那么实施就在这里.