在 Java 中使用弱引用的成本
2022-08-31 23:43:00
有没有人研究过创建和垃圾回收Java WeakReference对象所涉及的运行时成本?多线程应用程序是否存在任何性能问题(例如争用)?
编辑:显然,实际的答案将取决于JVM,但也欢迎一般观察。
编辑2:如果有人对性能进行了一些基准测试,或者可以指出一些基准测试结果,那将是理想的。(抱歉,赏金已过期...)
有没有人研究过创建和垃圾回收Java WeakReference对象所涉及的运行时成本?多线程应用程序是否存在任何性能问题(例如争用)?
编辑:显然,实际的答案将取决于JVM,但也欢迎一般观察。
编辑2:如果有人对性能进行了一些基准测试,或者可以指出一些基准测试结果,那将是理想的。(抱歉,赏金已过期...)
弱引用对 CMS 垃圾回收器有负面影响。据我所知,从我们服务器的行为来看,它会影响并行注释阶段时间。在此阶段,所有应用线程都将停止,因此这是非常不可取的。因此,您需要小心使用弱引用。
我曾经实现过一个Java垃圾回收器,所以我能够完成的都是一个(弱:)可能性的下限。
在我的实现中,在垃圾回收期间访问每个弱引用时,每个弱引用都有少量恒定的额外开销。
所以结果是:我不会担心它,除非你使用大量的弱引用,否则这不是一个大问题。
最重要的是,成本与存在的弱引用的数量成正比,而不是与整个堆的大小成正比。
但是,这并不是说支持弱引用的垃圾回收器会像不支持弱引用的垃圾回收器一样快。这里假定的问题是,鉴于Java支持弱引用,使用它们的增量成本是多少?
我的是一个简单的“停止世界”标记/扫垃圾收集器。在垃圾回收期间,它会为每个对象确定该对象是否处于活动状态,并在对象标头中设置一个位。然后它通过并释放所有非活动对象。LIVE
要处理弱引用,您只需添加以下内容:
LIVE
LIVE
LIVE
WeakReference
LIVE
此逻辑的微小变化适用于软引用和幻像引用。
如果您真的好奇,可以在这里实现。