2024 Clojure 状态调查!中分享您的想法。

欢迎!有关如何工作的更多信息,请参阅关于页面。

0 投票
Clojure

只是想明确我对那段代码的理解。

	Reference<Keyword> existingRef = table.get(sym);
if(existingRef == null) // keyword was not found
	{
	Util.clearCache(rq, table);  // force cleaning of the dead weak references in the whole cache

           ....create new keyword and store it wrapped into WeakReference in the cache
	}

也许我遗漏了什么,但迫使我从死弱引用中清除缓存的原因/假设是什么,如果rq不为空,即进行整个缓存的序列扫描以定位死引用并将它们移除。
序列扫描在调用Keyword函数时执行,即阻塞了调用者。

一种简单的方法是分配一个线程,定期收集缓存中的垃圾 (~10秒等)

1 答案

+1 投票

选中
 
最佳答案

clearCache仅在队列中有死弱引用时才清除缓存(即gc运行并强制一些腐败)。如果存在这些死引用,应清除它们,以防其中一个是正在内联的关键词。

在实现这一点时,考虑到了几种策略,包括使用独立的线程,但这也存在一些初始化和清理的问题。

by
感谢解释!

根据我的理解,关键词缓存适用完美案例是使用一个更多或更少的定义好的一组关键词,理想情况下在设计中固定所有的关键词。因此缓存预热并使用“轻”的WeakReference维护成本运行。
...