如何释放 JavaScript 中的内存

我使用的是画布及其 ImageData 对象,它包含大量数据(数百万个整数)。因此,使用少数几个数组已经占用了大量内存(最多可达300MB)。有没有办法在不必要的时候释放一些数组的内存?我试着把 undefined赋给那个变量。对吗?

94887 次浏览

JavaScript 具有自动内存管理功能。包含不再被引用的对象的内存将有资格进行垃圾回收,除非存在内存泄漏。通常不需要手动将 undefined分配给变量。

如果您的程序使用了太多的内存,您应该使用 心理医生数组来删除您不再需要的元素。参见 Array.popArray.shiftArray.splice

如果变量持续存在(比如它是全局的或者是某个持久性数据结构的一部分) ,并且它指向的数据很大,你希望这些数据能够被垃圾收集,那么你给这个变量分配一些小的值是正确的。undefinednull""都能正常工作。您正在做的是清除对大数据的引用,以便它可以进行垃圾收集。如果 javascript 中没有其他任何数据引用,那么垃圾收集器就可以释放这些数据。如果其他任何东西对它有引用,那么它就不能被释放。

例如,如果一个全局变量中包含10,000个元素数组:

var largeDataArray = new Array(10000);

并且,您已经用数据填充了大多数元素,那么您可以通过赋予它一些其他值来允许该内存进行垃圾收集,如:

largeDataArray = null;

或者如果你仍然希望它是一个数组:

largeDataArray = [];

注意: 超出作用域的变量(比如函数中的局部变量,它们不属于持久闭包的一部分)或超出作用域的对象中的变量不需要手动清除。当它们超出范围或父对象被删除时,其中包含的数据也将有资格进行垃圾收集。

因此,清除变量只需要在你明确想要释放保存在一个长时间变量中的数据时才需要做,而且通常只有当数据量很大或者你有很多加起来达到数兆字节的数据时才需要担心这个问题(智能手机的内存使用比桌面浏览器的内存使用更为重要)。