如何销毁一个JavaScript对象?
最近,我遇到了一个消耗太多内存的应用程序,增加了10 MB /秒。
所以,我想知道销毁JavaScript对象和variables的最好方法,所以内存消耗保持不变,我的FF不会被破坏。
我每隔8秒调用两次JavaScript,而不重新加载页面。
function refresh() { $('#table_info').remove(); $('#table').hide(); if (refreshTimer) { clearTimeout(refreshTimer); refreshTimer = null ; } document.getElementById('refresh_topology').disabled=true; $('<div id="preload_xml"></div>').html('<img src="pic/dataload.gif" alt="loading data" /><h3>Loading Data...</h3>').prependTo($("#td_123")); $("#topo").hide(); $('#root').remove(); show_topology(); }
如何查看哪个variables导致内存开销和方法停止执行该进程?
你可以把你所有的代码放在一个命名空间下,如下所示:
var namespace = {}; namespace.someClassObj = {}; delete namespace.someClassObj;
使用delete关键字将删除对该属性的引用,但在低层次上,JavaScript GC将获得有关要回收哪些对象的更多信息。
你也可以使用chrome来获取你的应用程序的内存configuration文件,以及你应用程序中的哪些对象需要缩小。
你不能删除对象,当没有更多的引用时它们被删除。 您可以删除引用。
但是,如果您在对象中创build了循环引用 ,则可能需要解除某些操作。
虽然现有的答案已经给出了解决这个问题的解决scheme,并且问题的后半部分没有提供对粗体问题的前半部分的自发现方面的回答:“我怎样才能看到哪个variables导致内存开销 ……?”
Chrome开发工具“ Profiles ”部分现在function非常强大,function也很丰富。 铬团队有一个关于使用它的洞察力的文章 ,因此垃圾收集(GC)是如何在JavaScript中工作的,这是这个问题的核心。
由于delete
基本上是Yochai Akoka当前接受的答案的根源,记住删除操作是很重要的。 如果不与GC在接下来的两个答案中的工作原理结合起来就没有关系:如果存在对象的现有引用,则不会清除它。 答案是更正确的,但可能不被赞赏,因为他们需要更多的思考,而不仅仅是写'删除'。 是的,一个可能的解决scheme可能是使用删除,但是如果还有另外一个内存泄漏的引用,则无关紧要。
精致的网站没有适当的提到循环引用和铬团队文档可以提供更多的清晰度以及validation原因的工具。
由于在这里提到了删除,所以提供资源“ 理解删除”也是有用的。 但它并没有涉及任何与js的GC相关的实际解决scheme。
对代码进行结构化,以便所有的临时对象都位于闭包中,而不是全局名称空间/全局对象属性,并且在完成后就超出范围。 GC会照顾其余的。
我正面临着这样一个问题,并且有了简单地改变有问题的对象的孩子的内在的问题的想法。
adiv.innerHTML = "<div...> the original html that js uses </div>";
似乎很脏,但它拯救了我的生命,因为它的工作!