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