我正在使用canvas及其ImageData对象,其中包含大量数据(数百万个整数)。因此,使用几个阵列已占用大量内存(最多300MB)。有没有办法在没必要时释放某些阵列的内存?我正在尝试将undefined
分配给该变量。是不是?
答案 0 :(得分:99)
如果变量持续存在(例如它是全局的或某些持久性数据结构的一部分)并且它指向的数据很大并且您希望该数据符合垃圾收集的条件,那么您可以为该变量分配一些小的数据。 undefined
或null
或""
都会有效。您正在做的是清除对大数据的引用,以便它有资格进行垃圾回收。如果你的javascript中没有其他内容可以引用该数据,那么它可以被垃圾收集器释放。如果有任何其他内容引用它,则无法释放它。
例如,如果在全局变量中保存了10,000个元素数组:
var largeDataArray = new Array(10000);
并且,您已经使用数据填充了大多数元素,然后您可以通过为其分配一些其他值来允许该内存符合垃圾收集条件:
largeDataArray = null;
或者你仍然希望它是一个数组:
largeDataArray = [];
注意:自身超出范围的变量(如不属于持久闭包的函数中的局部变量)或自身超出范围的对象中的变量不必手动清除。当它们超出范围或删除父对象时,其中包含的数据也有资格进行垃圾回收。
因此,只有当你明确想要释放持久变量中保存的数据时才需要清除变量,并且当数据很大或者你有大量的数据时通常只需要担心这个问题。它们可以累加到数兆字节的数据(智能手机上的内存使用率比桌面浏览器更低)。
答案 1 :(得分:5)
JavaScript具有自动内存管理功能。包含不再引用的对象的内存将有资格进行垃圾回收,除非您有内存泄漏。 通常无需手动为变量指定undefined
。
如果你的程序使用了太多内存,你应该收缩数组以摆脱你不再需要的元素。请参阅Array.pop
,Array.shift
和Array.splice
。