有没有人研究过创建和垃圾回收Java WeakReference对象所涉及的运行时成本?对于多线程应用程序,是否存在任何性能问题(例如争用)?
编辑:显然,实际答案将取决于JVM,但也欢迎一般性的观察。
编辑2:如果有人对性能进行了基准测试,或者可以指向一些基准测试结果,那就太好了。(抱歉,但悬赏已经过期了...)
有没有人研究过创建和垃圾回收Java WeakReference对象所涉及的运行时成本?对于多线程应用程序,是否存在任何性能问题(例如争用)?
编辑:显然,实际答案将取决于JVM,但也欢迎一般性的观察。
编辑2:如果有人对性能进行了基准测试,或者可以指向一些基准测试结果,那就太好了。(抱歉,但悬赏已经过期了...)
弱引用会对CMS垃圾回收器产生负面影响。就我们服务器的行为来看,它会影响并行标记阶段的时间。在此阶段中,所有应用程序线程都会停止运行,因此这是一件极其不可取的事情。因此,您需要小心处理弱引用。
LIVE
位时,忽略弱引用(即它们不会导致所引用的对象的LIVE
位被设置)。LIVE
,并且它是一个WeakReference
,则检查它弱引用的对象,如果该对象不是LIVE
,则清除引用。这个逻辑的小变化也适用于软引用和虚引用。
如果您真的很好奇,实现在这里。
finalize()
,以便不会重复执行。因此,如果未设置该位,则实际上非“LIVE”对象将被排队进行终结,如果设置了该位,则立即释放。 - Archie如果应用程序是按需重建的,例如在getter中,使用弱引用进行缓存可能会显着减慢应用程序的运行速度:
public Object getSomethingExpensiveToFind() {
if(cache.contains(EXPENSIVE_OBJ_KEY)) {
return cache.get(EXPENSIVE_OBJ_KEY);
}
Object sth = obtainSomethingExpensiveToFind(); // computationally expensive
cache.put(EXPENSIVE_OBJ_KEY, sth);
return sth;
}