最近,我遇到了一个耗费太多内存且增加10 MB /秒的应用程序。
所以,我想知道破坏JavaScript对象和变量的最佳方法,以便内存消耗保持不变,我的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();
}
如何查看哪个变量导致内存开销以及停止执行该进程的方法?
答案 0 :(得分:79)
您可以将所有代码放在一个名称空间中,如下所示:
var namespace = {};
namespace.someClassObj = {};
delete namespace.someClassObj;
使用delete
关键字将删除对该属性的引用,但在较低级别,JavaScript垃圾收集器(GC)将获取有关要回收哪些对象的更多信息。
您还可以使用Chrome开发者工具获取应用的内存配置文件,以及应用中的哪些对象需要按比例缩小。
答案 1 :(得分:30)
您无法删除对象,当没有对象的引用时,它们将被删除。您可以使用delete
删除参考。
但是,如果您在对象中创建了循环引用,则可能需要解除某些事情。
答案 2 :(得分:24)
虽然现有的答案已经提供了解决问题的解决方案和问题的后半部分,但它们没有提供问题的前半部分的自我发现方面的答案:&#34;如何我可以看到哪个变量导致内存开销 ...?&#34;
3年前它可能不那么强劲,但Chrome开发者工具&#34; 个人资料&#34;部分现在相当强大,功能丰富。 Chrome团队在使用它时有一个 insightful article ,因此垃圾收集(GC)在javascript中也是如此,这是这个问题的核心。
由于delete
基本上是Yochai Akoka目前接受的答案的根源,因此记住删除的内容非常重要。如果不与GC在以下两个答案中如何工作的概念相结合,则无关紧要:如果现有的对象的引用未被清除。答案更正确,但可能不那么受欢迎,因为他们需要更多的思考,而不仅仅是写'删除&#39;。是的,一种可能的解决方案可能是使用delete
,但是如果还有另一个对内存泄漏的引用则无关紧要。
delicateLatticeworkFever恰当地提到了循环引用,Chrome团队文档可以提供更多的清晰度以及验证原因的工具。
由于此处提到delete
,因此提供资源Understanding Delete可能也很有用。虽然它没有涉及与js的GC真正相关的任何实际解决方案。
答案 3 :(得分:7)
构造代码,以便所有临时对象都位于闭包内而不是全局命名空间/全局对象属性中,并且在完成它们时超出范围。 GC将负责其余部分。
答案 4 :(得分:1)
我遇到了这样的问题,并且只想改变有问题对象的孩子的innerHTML。
adiv.innerHTML = "<div...> the original html that js uses </div>";
看起来很脏,但它保存了我的生命,因为它有效!