目前,我们有一个简单的最近最少使用算法,该算法一旦超过某个限制就会开始删除旧条目,还有第二个算法在驱逐条目之前考虑重用和年龄。
然而,当我在 Chrome 中测试一个有重复请求的网站时,我注意到当缓存已满时,一个 5 MB 的大文件会不断从缓存中被逐出,而较小的文件则会被保留在缓存中。
关于缓存驱逐的文档是否有误,或者对该行为还有其他解释吗?
答案1
解释很简单:Chrome(ium)不是使用“简单的最近最少使用算法”。
检查 Chromium 源文件 内存缓存.cpp 在其最后找到这行代码,其中包含打印出缓存的调试例程:
printf("LRU-SP lists in eviction order (Kilobytes decoded, Kilobytes encoded, Access count, Referenced, isPurgeable, wasPurged):\n");
LRU-SP 算法最早在论文中描述 LRU-SP:一种用于 Web 缓存的大小调整和流行度感知的 LRU 替换算法,在第二十四届年度国际计算机软件和应用程序会议上发表。
该算法的描述在文章中给出 各流行的网络浏览器采用什么样的缓存替换策略?,由 Felix Gessert 贡献:
LRU-SP 扩展了经典的最近最少使用 (LRU) 算法,将不同的对象大小 (1) 考虑在内。不考虑不同的延迟 (2)。LRU-FP 是 PSS(金字塔选择方案)的扩展。LRU-SP 算法的工作原理如下:
- 每个对象 x 被分配到一个类:
每个类维护一个单独的 LRU 列表
每次请求缓存对象时,它可能会根据上述公式更改类
当需要替换对象时,该算法会查看每个 LRU 列表中最近最少使用(即最旧)的对象,并选择具有最小 其中 R 是自上次获取缓存对象以来对该缓存对象的请求数
(1)恢复缓存
我猜测,在您的情况下,公式“大小/访问次数”给出了一个很大的值,因为这是一个只访问过一次的大文件,所以这个 5 MB 的文件是第一个被驱逐的候选文件。