Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript关闭:内存泄漏_Javascript_Google Chrome_Memory Leaks_Closures - Fatal编程技术网

Javascript关闭:内存泄漏

Javascript关闭:内存泄漏,javascript,google-chrome,memory-leaks,closures,Javascript,Google Chrome,Memory Leaks,Closures,我有一个记忆泄漏,我不明白。我编程了一个机制来处理半自动解绑的事件,这应该允许我轻松地清理内存。 但在一个例子中,清理没有发生(我使用chrome的“配置文件(内存堆)”检查“EventHandler”的实例)。我真的不明白为什么会这样。关闭有点奇怪 通过handler变量创建包含对EventHandler实例引用的闭包。加载映像后,其中一个闭包仍然存在: handler.addListener("ImageLoaded", handler, function() {

我有一个记忆泄漏,我不明白。我编程了一个机制来处理半自动解绑的事件,这应该允许我轻松地清理内存。 但在一个例子中,清理没有发生(我使用chrome的“配置文件(内存堆)”检查“EventHandler”的实例)。我真的不明白为什么会这样。关闭有点奇怪


通过
handler
变量创建包含对
EventHandler
实例引用的闭包。加载映像后,其中一个闭包仍然存在:

    handler.addListener("ImageLoaded", handler, function() {
        Loader.files[src] = function(fnct) {
            fnct(img);
        }
    });     
它是内部函数
函数(fnct){…
。只要闭包存在,
EventHandler
的实例就无法释放。唯一的解决方案是摆脱该闭包。或者,如果可能,您可以手动释放该实例。以下操作可能对您有效:

handler.fire("Delete");
handler = undefined;

Chrome的内存分析器向您显示对象的保留树,这只是表示“谁持有该对象的引用”的另一种方式。在您的示例中,它是EventHandler,当您添加“侦听器”时,如果您长时间使用查询,请确保您正在删除它

this.listeners = new Object();

这会将对象作为数组添加到侦听器中,但不会在任何时候删除它们


这可能是内存消耗的原因。它可能不会泄漏,它的对象分配。这会使用浏览器消耗您的RAM。:

请您按照错误消息所说的做,并将代码从JSFIDLE粘贴到问题上。谢谢。我真的不知道代码的哪一部分更有意义,实际上我有点不安stackoverflow警告。如果有人能对我的问题投赞成票,我会悬赏50美元来获得答案…我认为50个代表WXA就足够了,我刚读到它是75。我想我需要等待更长的时间才能得到答案。你不“绑定”吗方法每次调用时都会创建一个新的匿名函数。因此,每次添加侦听器时,都会添加一个新的匿名函数作为侦听器。这让我感到不安,因为理论上.RemovelListener方法需要目标和侦听器函数(完全相同的对象)作为参数。这难道不是第一个问题吗?此外,您使用初始化之前的“deleteListenerID”否?这是函数的返回值,并且在加载映像时在同一函数中使用了一个变量。由于我将其设置为另一个值,所以删除了Loader.files[src]=function(fnct){fnct(img);}当然,你是对的,我错过了这一点。但这并没有多大改变:这个函数阻止EventHandler实例被释放(探查器说)。我不是100%确定,但如果有一个函数存在,它可以引用处理程序变量,那么EventHandler实例就不会被释放。您建议如何使该函数不再存在?我不知道它可以保存在哪里。:s这应该可以解决问题。问题是您似乎需要此函数。它是当
Loader时调用。为已加载的映像调用LoadImage
。我不确定是否得到您的解决方案。请写完整的代码好吗?我正在删除它们。在控制台上,您可以看到“事件(0,4)--删除”表示最后一个剩余的侦听器已被删除。这是在系统中处理侦听器时的一般做法。您需要处理这些侦听器,包括删除它们。在某些情况下,这同样适用于浏览器:)如果要删除它们,则我无法访问。但要进行双重检查,请检查console的侦听器[]中的元素“。无论它是否有元素。将对象添加到控制台,会使chrome在它们上保留另一个引用。但是,既然您只是在谈论侦听器[],尝试一下应该不会有什么坏处(今晚我会尝试)。
this.listeners = new Object();
this.listeners[e] = new Object();