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运行并强制某些引用成为被gc的)。如果这些死引用存在,应将其清除,以防其中一个引用是对应的interned关键词。

在实现此功能时,考察了几种策略,包括使用单独的线程,但这也存在初始化和清理的问题。

谢谢解释!

根据我的理解,使用关键字缓存的理想情况是在设计时使用一个相对定义明确的集合,最好是理想化地使用所有固定的关键字。因此缓存被预热并具有“轻量级”的WeakReference维护成本。
...