Ami*_*hah 73 javascript object destroy
最近,我遇到了我的一个应用程序,它消耗了太多的内存并增加了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();
}
Run Code Online (Sandbox Code Playgroud)
如何查看哪个变量导致内存开销和方法停止执行该进程?
Yoc*_*oka 85
您可以将所有代码放在一个名称空间下,如下所示:
var namespace = {};
namespace.someClassObj = {};
delete namespace.someClassObj;
Run Code Online (Sandbox Code Playgroud)
使用该delete关键字将删除对该属性的引用,但在低级别,JavaScript垃圾收集器(GC)将获得有关要回收哪些对象的更多信息.
您还可以使用Chrome开发者工具获取应用的内存配置文件,以及应用中的哪些对象需要按比例缩小.
del*_*ver 31
您无法删除对象,当没有对象的引用时,它们将被删除.您可以删除引用delete.
但是,如果您在对象中创建了循环引用,则可能需要解除某些内容.
Shw*_*ogg 28
虽然现有的答案已经给出了解决问题的解决方案和问题的后半部分,但它们没有提供问题的前半部分的自我发现方面的答案:"我怎样才能看出哪个变量导致内存开销 ......?"
它可能不像3年前那么强大,但Chrome Devevloper Tools" Profiles "部分现在非常强大且功能丰富.Chrome团队有一篇关于使用它的深刻文章,以及垃圾收集(GC)如何在javascript中工作,这是这个问题的核心.
由于delete基本上是Yochai Akoka目前接受的答案的根源,重要的是记住删除的作用.如果没有结合GC在接下来的两个答案中如何工作的概念,这是无关紧要的:如果现有对象的引用它没有被清理.答案更正确,但可能不太受欢迎,因为他们需要更多的思考而不仅仅是写'删除'.是的,一种可能的解决方案可能是使用delete,但如果有另一个内存泄漏的引用则无关紧要.
tinyLatticeworkFever恰当地提到了循环引用,Chrome团队文档可以提供更多的清晰度以及验证原因的工具.
由于delete此处提到,提供资源理解删除也可能很有用.虽然它没有涉及与js的GC真正相关的任何实际解决方案.