使用AJAX调用在站点中可能发生内存泄漏

时间:2013-08-13 14:56:48

标签: jquery ajax json performance memory-leaks

我在我的网站中使用了一个进行AJAX调用的函数。它返回一个包含在javascript函数中的JSON字符串,同时使用JSONP跨域访问以获取我需要的数据。 JSON字符串非常大,大小约为1MB。我遇到的问题是,每次通话都会注意到我的内存大小约为1MB。会发生什么事情是加班,在IE9中,我得到一个错误声明它是'Out Of Memory'。我该如何防止这种情况发生?

Here is a picture of the memory usage over time that I took with Chrome using the Memory Timeline.

我很好奇我是否接收到JSON数据的每个回调函数,如果它在DOM中堆叠,而不是完全替换它?有没有办法确保我首先从DOM中删除旧的回调函数JSON数据,然后调用API以获取一个填充了JSON数据的新回调函数?

我在HTML中使用以下命令启动该函数:

setTimeout(grabParature, 10000);

这是被调用的函数(出于显而易见的原因省略了token):

function grabParature() {
var url = "https://s3.parature.com/api/v1/5406/5426/Ticket";

$.ajax({
    url: url,
    type: "GET",
    dataType: "jsonp",
    cache: true,
    jsonp : "_callback_=",
    jsonpCallback: "theData",
    data: {
        "_status_type_": "open",
        "_pageSize_" : "500",
        "_output_" : "javascript",
        "_token_" : "#####################"
    },
    success: function (results) {
        var openTickets = 0;
        var newTickets = 0;
        var atschoolTickets = 0;
        var hardwareTickets = 0;
        var softwareTickets = 0;
        var networkTickets = 0;

        console.log(results);

        for(var i = 0; i < results.Entities.Ticket.length; i++)
        {
            var queue = "";
            var status = results.Entities.Ticket[i].Ticket_Status.Status.Name["#text"];

            if (results.Entities.Ticket[i].Ticket_Queue != undefined) {
                queue = results.Entities.Ticket[i].Ticket_Queue.Queue.Name["#text"];
            }

            if (status === "Open") {
                openTickets++;
            }
            else if (status === "New") {
                newTickets++;
            }

            if (queue === "Hardware") {
                hardwaretickets++;
            }
            else if (queue === "Atschool") {
                atschoolTickets++;
            }
            else if (queue === "Network") {
                networkTickets++;
            }
            else if (queue === "Software") {
                softwareTickets++;
            }
        }
        $('#span_openTickets').html(openTickets);
        $('#span_newTickets').html(newTickets);
        $('#span_hardwareTickets').html(hardwareTickets);
        $('#span_atschoolTickets').html(atschoolTickets);
        $('#span_networkTickets').html(networkTickets);
        $('#span_softwareTickets').html(softwareTickets);

        results = null;
    }
});

};

1 个答案:

答案 0 :(得分:0)

我弄明白了这个问题。我从我的函数中删除了以下行:

console.log(results);

现在网站没有像发布的图片那样消耗内存。内存时间轴更像是预期的锯齿图。