【问题标题】:memory leak while drawing many new images to canvas在画布上绘制许多新图像时内存泄漏
【发布时间】:2013-11-19 23:39:40
【问题描述】:

我编写了一个“幻灯片放映”,它可以按顺序快速显示图像,就像定格电影一样。

一旦显示图像,我将不再使用它,我想将其从内存中清除,以便为新图像腾出空间。但是,在 Activity Monitor 中监控 Google Chrome Helper 时,我看到内存持续稳定增加,直到浏览器崩溃。

我注意到a chrome garbage collection issue 是作为错误提交的,我想知道我是否遇到了这种情况?

否则,这是我尝试基于this post 让 Chrome 丢弃我的旧图像数据的一个技巧示例。

  function ClearChunk()
  {      
        imageSet1 = null; // garbage collect please?
        imageSet1 = [];
  }

  function LoadNewChunk()
  {
        for (i=start_of_chunk;i<end_of_chunk;i++)
        {
              imageSet1[i-start_of_chunk] = new Image();
              imageSet1[i-start_of_chunk].src = img[i]; 
        }
  }

这首先清除,然后在后台加载,同时显示另一组图像。这在当时似乎是个好主意,但在我的机器上它仍然稳定地攀升到大约 3Gb 并且...... 哦,Snap。

首先如何缓解这种猖獗的内存消耗?

我们将不胜感激任何对话或基于代码的反馈。

【问题讨论】:

  • 你在很短的时间内使用了大量的图像,垃圾收集只会偶尔出现,而不是每次你问的时候。尝试避免执行“= new Image()” 999999 次并找到一种仅更改 src 的方法。
  • 虽然你根本不能要求 JS 做 GC.. 这是一个纯粹的内部机制,清空一个值并不能保证 GC。
  • 只是为了确定,因为你没有提到它:你是否确保没有一个对象保留你的图像的引用(一个数组,一个 DOM 对象,......????) .因为这是首先要检查的。
  • 我已经尝试过更多的尝试,到目前为止,对我来说最好的解决方案是使用更少的图像;)我确定我已经在某处保留了参考......我会如果我有任何启发,请更新。

标签: javascript image google-chrome canvas memory-leaks


【解决方案1】:

网络工作者?可能 ?

==============

最近看到了一些关于.... 如果你声明一个变量...

var tempa = 0;

vs 没有实际声明变量。但只是给它分配一些东西。

var tempa = 0; // 不要这样做

temp_no_var = 0; // 有某种“删除”功能可以从内存中删除变量,或者更确切地说是减少内存空间。

也许在使用图像之后只是简单地将其赋值为 null 或 0。而不是将图像数据留在变量中并希望等待垃圾回收。

================== 重用变量,而不是制作不断增长的巨大数组。

================== 查看 imagemagik 并了解如何创建“gif”动画图片。如果影片剪辑 errr 图像集中的信息不改变。

【讨论】:

    【解决方案2】:

    尝试只做一个'new Image()',然后重复使用它,而不是在循环中创建很多。这帮助我解决了同样的问题。

    【讨论】:

    • 情况不同但结果相同。如果我使用带有画布 drawImage 的图像在循环中调整它的大小,如果我删除图像和画布的引用,Chrome 内存会不断增长,但如果我在调整大小后取消 src,则会调用垃圾收集器并且记忆停止增长。 Firefox 和 IE 不需要这种解决方法。
    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多