【问题标题】:How to free memory after an Ajax request如何在 Ajax 请求后释放内存
【发布时间】:2011-03-25 23:39:41
【问题描述】:

我的网站上有一个非常基本的 ajax 幻灯片。每次滚动时,新的图像和响应内容都会不断增加浏览器使用的内存量。

我已完成研究并尝试了所有建议以在每个新请求上重置 XHR 对象,但这绝对无济于事。

幻灯片是基本的,但可能包含数百张幻灯片。我希望用户能够无限期地浏览幻灯片而不会导致浏览器崩溃。这甚至可能吗?

谢谢,布赖恩

【问题讨论】:

  • 你使用什么样的机制来加载图片?
  • @timdev - ajax 响应包含纯 html,然后我使用 .innerHTML 将其放入 DOM 中

标签: javascript ajax memory browser memory-leaks


【解决方案1】:

增加内存使用是正常的。毕竟,您每次都在加载更多数据——来自 AJAX 响应的 HTML,以及正在显示的图像。除非您使用的是 Adob​​e Pagemill 生成的 HTML,否则只有几百字节的 HTML/文本。图像会占用最多的空间。一切都被塞进浏览器的缓存中。

由于您没有直接对 DOM 做任何花哨的事情(构建子树等),只是重复地替换了一大块 HTML,最终浏览器会进行清理并丢弃一些未使用的/旧的/陈旧的图像从内存/缓存中获取数据并回收部分内存。

现在,如果您正在执行一些高度复杂的 DOM 操作并动态生成大量新节点,并且到处泄漏一些节点,那么您就会遇到内存问题,因为这些泄漏的节点最终会掩埋浏览器。

但是,通过加载图像来增加内存使用量没什么好担心的,它就像一个正常的扩展冲浪会话,除了你只是加载一些新图片。

【讨论】:

    【解决方案2】:

    如果是幻灯片,您是否一次只显示一张图片?如果你一次只显示一个并且你永远不会摆脱你显示的最后一个,它总是会增加内存。如果您删除未显示的幻灯片,它应该会有所帮助。

    【讨论】:

    • 目前我只是通过 innerHTML 替换 HTML 内容,所以我不确定这是否算作正式删除它。用javascript正式删除DOM节点会按照您的描述进行吗?
    • 我认为您不需要释放 XHR 对象,它不会节省太多内存。事实上,尝试在所有调用中使用相同的。这里似乎正在消耗内存的是您为每个页面显示的内容越来越多。您应该尝试一次只保留 3 个:t-1、t、t+1。通过innerHTML 用新内容替换旧内容理论上应该会删除旧资源——确保您不会不小心将它们存储在字符串变量或其他引用中。我会尝试将内容交换放在一个范围有限的函数中,这样每次退出函数时,内存都会被释放。
    猜你喜欢
    • 2013-07-02
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    相关资源
    最近更新 更多