hay*_*nar 64 javascript arrays memory-management html5-canvas
我正在使用canvas及其ImageData对象,它包含大量数据(数百万个整数).因此,使用几个阵列已占用大量内存(最多300MB).有没有办法在没必要时释放某些阵列的内存?我正在尝试分配undefined
给该变量.这样对吗?
jfr*_*d00 107
如果变量持续存在(例如它是全局的或某些持久数据结构的一部分)并且它指向的数据很大并且您希望该数据符合垃圾收集的条件,那么您可以为该变量分配一些小的内容. undefined
或null
或""
将所有的工作.您正在做的是清除对大数据的引用,以便它有资格进行垃圾回收.如果你的javascript中没有其他内容可以引用该数据,那么它可以被垃圾收集器释放.如果其他任何东西都有引用它,那么它就不能被释放.
例如,如果在全局变量中保存了10,000个元素数组:
var largeDataArray = new Array(10000);
Run Code Online (Sandbox Code Playgroud)
并且,您已经使用数据填充了大多数元素,然后您可以通过为其分配一些其他值来允许该内存符合垃圾收集条件:
largeDataArray = null;
Run Code Online (Sandbox Code Playgroud)
或者如果你仍然希望它是一个数组:
largeDataArray = [];
Run Code Online (Sandbox Code Playgroud)
注意:自身超出范围的变量(如不属于持久闭包的函数中的局部变量)或自身超出范围的对象中的变量不必手动清除.当它们超出范围或删除父对象时,其中包含的数据也将有资格进行垃圾回收.
因此,只有当你明确想要释放持久变量中保存的数据时才需要清除变量,并且通常只有在数据很大或你有很多数据添加时才担心这个问题.高达数兆字节的数据(智能手机上的内存使用率低于桌面浏览器).
JavaScript具有自动内存管理功能.包含不再引用的对象的内存将有资格进行垃圾回收,除非您有内存泄漏.通常无需手动分配undefined
变量.
如果你的程序使用了太多的内存,你应该缩小数组以摆脱不再需要的元素.见Array.pop
,Array.shift
和Array.splice
.
归档时间: |
|
查看次数: |
71098 次 |
最近记录: |