Javascript JS中的内存泄漏

Javascript JS中的内存泄漏,javascript,asp.net-mvc,memory-leaks,Javascript,Asp.net Mvc,Memory Leaks,我有一个包含以下内容的javascript文件 "use strict"; $(function () { var divs = $(".sc-frames"); var next = 0; var currentIndex = 0; var request = function (action, controller, div) { var url = "../" + controller + "/" + action; $.ajax({ type: "GE

我有一个包含以下内容的javascript文件

"use strict";
$(function () {
var divs = $(".sc-frames");
var next = 0;
var currentIndex = 0;

var request = function (action, controller, div) {
    var url = "../" + controller + "/" + action;

    $.ajax({
        type: "GET",
        url: url,
        dataType: "html",
        async: false,
        timeout:10000,
        success: function (result) {

            writeResponse(result, div);
        },
        error: function () {
            $("#errorMessage").show();
        }
    });
};

var writeResponse = function (result, div) {
    $(div).hide().html(result).slideDown("slow"); 
    currentIndex = divs.index($(div));
    if (parseInt(divs.length - 1) == parseInt(currentIndex)) {
        next = 0;
    } else {
        next++;
    }
};

var createRequest = function () {
    $("#errorMessage").hide();
    $(divs[currentIndex]).empty(); 
    var div = divs[next]; 
    var action = $(div).attr("data-action");
    var controller = $(div).attr("data-controller");
    request(action, controller, div);
};

setInterval(createRequest, 30000);
createRequest(); 

});
这只是对3控制器操作方法进行ajax调用,并将视图依次连续地发布到div

但是当我在谷歌chrome开发工具中检查性能监视器时,它显示了一个js内存泄漏。Js堆大小正在缓慢增加

有没有办法找出内存泄漏的确切位置

提前谢谢

更新 您需要使用clearIntervalcreateRequest


当您不再需要运行代码时。

您可以通过删除一小部分功能或一行代码来确定何时不会发生这种情况,然后您就知道是什么原因导致了这种情况。但是,我找不到你停止循环的地方?也许这是每30秒发送一次请求,而且从未停止

Js堆大小正在缓慢增加

这不一定是内存泄漏。大多数引擎使用stop the world garbage collection(停止世界垃圾收集),这意味着变量将留在内存中,尽管它们可能已经被收集,然后在某个时候GC启动,停止当前正在执行的JS,检查所有引用并释放不再被引用的内存,然后继续执行它是这样做的,因为JS是非常动态的,如果你一次检查所有变量,你就肯定知道,你不能告诉离开作用域的变量是否被完全取消引用

然而,这使得垃圾收集成为一项性能代价高昂的操作。因此,GC尝试尽可能少地启动,这意味着它只在内存已满时需要启动

因此,您不一定有内存泄漏,我在代码中也没有看到。在较长的时间内观察堆,等待几个gc周期或看起来像锯,然后检查整个图是否在增加。如果是这样的话,您就有了内存泄漏,因为有一些元素在garbagge收集中幸存下来,它们正在泄漏

有没有办法找出内存泄漏的确切位置


使用大多数调试器,您可以创建当前内存状态的快照。取其中两个,一个在垃圾收集之前,一个在垃圾收集之后,然后比较它们以找出到底泄漏了什么,然后通常可以追溯到泄漏它的代码。

这在屏幕上持续运行,因此从不停止。是否有办法清除代码中的内存(可能是每午夜一次)?当然,刷新页面。你为什么要这么做?您可以使用WebSocket或其他技术将内容推送到您的客户机。您是对的,它会随着图表的下降而在GC中起作用。但是整个图形在增加。有没有办法通过javascript清除它?@liroforum它增加了多少?gc多久启动一次?你强制gc了吗?我在描述部分添加了屏幕截图。我手动强制GC,如最后3次浸渍所示。但总的来说,图表会增加。@liroforum您在很短的时间内测量的结果。如果创建一个小时左右的图表会发生什么?类似的结果。