如何销毁JavaScript对象?

如何销毁JavaScript对象?,javascript,object,destroy,Javascript,Object,Destroy,最近,我遇到了我的一个应用程序,它消耗了太多内存,并且以10 MB/秒的速度增长 所以,我想知道如何销毁JavaScript对象和变量,以减少内存消耗,使我的FF不会被销毁 我每8秒调用两个脚本,而不重新加载页面 function refresh() { $('#table_info').remove(); $('#table').hide(); if (refreshTimer) { clearTimeout(refreshTimer);

最近,我遇到了我的一个应用程序,它消耗了太多内存,并且以10 MB/秒的速度增长

所以,我想知道如何销毁JavaScript对象和变量,以减少内存消耗,使我的FF不会被销毁

我每8秒调用两个脚本,而不重新加载页面

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();
}
函数刷新(){
$(“#表_信息”).remove();
$(“#表”).hide();
如果(刷新计时器){
clearTimeout(刷新计时器);
刷新计时器=空;
}
document.getElementById('refresh_topology')。disabled=true;
$('').html('加载数据…').prependTo($(“#td123”));
$(“#topo”).hide();
$(“#根”).remove();
显示拓扑();
}

如何查看哪个变量导致内存开销,停止该进程执行的方法是什么?

构造代码,使所有临时对象位于闭包内,而不是全局命名空间/全局对象属性,并在处理完它们后超出范围。GC将处理其余的对象。

您不能删除对象,当没有更多的引用时,对象将被删除。您可以使用
delete
删除引用


但是,如果您在对象中创建了循环引用,则可能需要对某些内容进行解耦。

您可以将所有代码放在一个名称空间下,如下所示:

var namespace = {};

namespace.someClassObj = {};

delete namespace.someClassObj;
使用
delete
关键字将删除对属性的引用,但在低级别上,JavaScript垃圾收集器(GC)将获得有关要回收哪些对象的更多信息


您还可以使用Chrome Developer工具获取应用程序的内存配置文件,以及应用程序中需要缩小的对象。

我曾经遇到过这样的问题,我想简单地更改有问题对象的子对象的innerHTML

adiv.innerHTML = "<div...> the original html that js uses </div>";
adiv.innerHTML=“js使用的原始html”;

看起来很脏,但它救了我的命,因为它的工作

虽然现有答案已经给出了解决问题和问题后半部分的解决方案,但它们没有提供问题前半部分的自我发现方面的答案(粗体):

“如何查看哪个变量导致内存开销?”

3年前它可能还没有那么强大,但Chrome开发者工具“Profiles”部分现在功能强大,功能丰富。Chrome团队对如何使用它以及垃圾收集(GC)
如何在javascript中工作都有自己的看法,这是这个问题的核心

由于
delete
基本上是Yochai Akoka目前接受的答案的根,因此记住delete的作用很重要。在接下来的两个答案中,如果不结合GC如何工作的概念,这是无关紧要的:如果存在对对象的引用,那么它不会被清除。答案更为正确,但可能不那么受欢迎,因为它们需要更多的思考,而不仅仅是写“删除”。是的,一种可能的解决方案可能是使用
删除
,但如果有另一个内存泄漏引用,这并不重要

适当地提及循环引用和Chrome团队文档可以提供更清晰的说明以及验证原因的工具


因为这里提到了
delete
,所以提供资源也可能很有用。尽管它没有
进入任何实际的解决方案,而这些解决方案实际上与javascript的垃圾收集器有关。

您是否考虑过使用闭包隔离代码的部分?您尝试过什么吗?例如使用
obj=null
?A)
显示拓扑结构的功能是什么B) 您是否曾经清除添加到
#td_123
中的内容C) 有这个的实时版本吗?按F12获取开发者工具。转到“配置文件”选项卡,然后单击“开始”以启动配置文件。您可以在JS CPU、CSS选择器上进行评测,还可以拍摄堆快照。或者在最新的chrome类型中,JS控制台中的performance一词很明显,但是您可以将名称空间命名为“g”,这样可以节省大量键入。使用g.curItem=。。。而不是var curItem=。。。并保存键入,同时允许g=undefined清除所有全局内存分配。您可以添加一个循环引用的示例,它不会被垃圾收集器捕获吗?找个朋友!;)@emilhem你可以引用垃圾收集器,它将删除自身和互联网-内爆可能会在CERN制造一个黑洞。你想过那个例子吗?