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运行并强制某些引用成为垃圾收集)。如果存在这些死亡引用,应该清除,以防其中之一是内联的关键字。

在实现时考察了多种策略,包括使用独立的线程,但这也有其初始化和清理问题。

感谢解释!

正如我理解的那样,关键字缓存使用的理想情况是在设计期间使用一个大致定义的关键字集, ideally _all_ 固定的。因此,缓存被预热并使用 "light" WeakReference 维护成本工作。
...