【问题标题】:How does the JavaScript Image object interact with the browser cache?JavaScript Image 对象如何与浏览器缓存交互?
【发布时间】:2020-08-07 01:03:10
【问题描述】:

我正在使用简单的对象来包装 Image 对象并跟踪它们何时加载,如下所示:

var preloader = {
    loaded: false,
    image: new Image()
}
preloader.image.onload = function() {
    preloader.loaded = true;
}
preloader.image.src = 'http://www.example.com/image.jpg';

图像加载完成后,preloader.loaded 设置为 true。一切正常。

我的问题是,当我有这么多这些对象和这么多图像以致浏览器缓存用完时会发生什么。最终,一旦加载了足够多的图像,浏览器就会开始将旧的图像从缓存中转储出来。在那种情况下,我最终不会得到loaded=true 的JavaScript 对象,但实际上不再缓存图像文件了吗?

这很难测试,因为在任何给定点我都无法分辨哪些图像仍在缓存中,哪些不在。

【问题讨论】:

  • 你指的是内存缓存还是磁盘缓存?
  • 从理论上讲非常好的问题,但实际上,@Kolink 的答案是正确的

标签: javascript image dom-events


【解决方案1】:

一旦您从网页加载了图像,就不会从缓存中使用它。它实际上在浏览器页面生命周期内或直到你摆脱这个 JS 对象以便它可以被垃圾收集。

缓存不用于存储页面上加载的图像。使用缓存以便下次请求加载此图像时,可以更快地加载它。如果您加载的图像过多以至于超出了缓存的存储空间,那么您已经加载的图像将不会发生任何事情,因为它们在页面期间(独立于缓存)在浏览器内存中。将会发生的是,您加载的某些图像将不再在缓存中,因此下次某些浏览器页面想要加载它们时,它们将不在缓存中,并且必须从其原始网站中获取通过互联网。

【讨论】:

  • 我明白了。所以我注意到,当我加载更多图像时,内存使用量会上升到一定的限制(Chrome 中约为 300M)然后下降到大约一半。这是否意味着图像仍然可用,但此时只是存储在磁盘上而不是内存中?
  • 加载到网页上的图像将在该网页的持续时间内保留在 MEMORY 中。他们被踢出磁盘的唯一方法是操作系统用完物理内存并使用虚拟分页到磁盘,但这仍然会报告内存使用情况。如果您看到浏览器内存使用量下降,那将是其他原因。请记住,如果您通过 javascript 加载大量图像,如果您不在 javascript 中保留对每个图像对象的引用,这些图像可能会被垃圾收集(从内存中释放并丢弃)。
【解决方案2】:

昨天我删除了过去几个月积累的 800MB 互联网缓存。简而言之,我认为不可能耗尽浏览器缓存,除非用户拥有一台非常旧的机器,或者您预加载了太多图像。

【讨论】:

  • 有磁盘缓存和内存缓存。在大多数浏览器中,可以设置这两者的大小,包括将大小设置为零。它们可以很容易地被填充,尽管填充缓存与已经为网页加载的图像无关 - 有关详细信息,请参阅我的答案。
  • 答案仍然适用于 RAM:p 谢谢你的澄清。 +1
猜你喜欢
  • 2010-09-14
  • 2020-05-11
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 2010-09-13
  • 2011-05-12
相关资源
最近更新 更多