除了浏览器缓存之外,还有其他几种浏览器缓存数据的方式。对于Chrome,呈现引擎眨眼中还有另一个缓存,它在内存中存储图像、样式、脚本和字体(可能更多)。
此缓存用于站点上的连续导航。从闪烁缓存传递的资源在“网络”选项卡中使用(from memory cache)标记。从浏览器缓存提供的资源被标记为(from disk cache)。
我现在的问题是,哪些资源存储在这个非常快的缓存中并从这个高速缓存中传递?,根据我的测试,它变化很大:
磁盘缓存 hits和内存缓存 hits之间的一个巨大差异与服务工作者结合在一起变得显而易见。无法在服务工作器中观察到内存中缓存所提供的请求(因为缓存位于服务工作者之前)。磁盘缓存提供的请求通过服务工作者传递(因为浏览器缓存位于Service后面)。
为了显示所解释的行为,我构建了一个包含所有资源类型的测试页面:https://dm-clone-optimized.app.baqend.com/
您可以使用顶部的链接浏览站点,并在“网络”选项卡和控制台中观察请求的行为。每个页面都加载相同的资源。
经过一些导航(Chrome 70.0.3538.67)之后,大多数情况下我都会得到这种行为:

scripts.js和scripts2.js来自内存缓存。logo.png也来自内存中。styles.css来自磁盘缓存 :(scripts2.js?id=1也来自磁盘缓存 :(不过,有时候,我真的很幸运,所有的东西都是从内存缓存中提供的:

我很想了解闪烁内存缓存是如何工作的,以及如何通过适当的cache control头来调优我的站点以便将它用于所有资源。
编辑--编辑--
我最关心的是:为什么根本不缓存动态添加的脚本?--这对像require.js这样的框架有明显的影响,因为它们将所有依赖项作为动态添加的脚本标记插入。
发布于 2018-11-28 14:37:31
闪烁内存缓存工作
Blink有四个内存分配器PartitionAlloc、Oilpan、tcmalloc和system allocator
因此,开发Chrome的团队已经将tcmalloc和system allocators从Blink中删除
眨眼(PartitionAlloc+Oilpan)是渲染器内存的第二大消费国,在典型情况下消耗10-20%,在可丢弃、CC和V8中保留部分内存。
在Blink中,主要的内存使用者是:
建议是:“识别对Blink的总内存有影响的缓存,并仅在其上实现purgeMemory()。”
他们正在努力摆脱"DiscardableMemory“项,这将有助于执行强制分离所有布局对象等操作,从而释放由布局树保留的内存。
发布于 2018-11-28 17:28:53
我相信这是铬优化的结果,他们让它对你来说很详细。
这些文件总是进入磁盘缓存。它们也会进入记忆中,很快就会脸红。
Chrome非常聪明,可以要求正在运行的进程在磁盘上查找之前,在内存中仍然有一个已加载的副本。该步骤具有很高的命中率,因为这些图像/js正在积极地用于某些事情。
您将无法控制chrome如何管理它们的TTL /内存容量可以用来保持blob热。Chrome团队在基于实际硬件容量和系统加载的动态调优方面做了很多工作。
如果你要求将你的应用程序保存在内存中。您正在失败的Sun/Adobe的邪恶方式:使他们的应用程序DLL在内存中热(通过托盘图标/服务),并减缓其他人的速度。
如果是应用程序的最终用户可能想要使用,使用电子,然后按照Whatsapp/Slack/etc来构建一个始终运行的应用程序。
https://stackoverflow.com/questions/52950068
复制相似问题