Утечка памяти в JS - PullRequest
       13

Утечка памяти в JS

0 голосов
/ 19 марта 2019

У меня есть файл 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(); 

});

Это просто вызывает ajax вызов метода действия 3 контроллера и отправляет представление в div по порядку и непрерывно, один за другим.

Но когда я проверил монитор производительности в Google Chrome Dev Tools, он показал утечку памяти js.Размер кучи Js медленно увеличивается.

Есть ли способ узнать, где именно происходит утечка памяти?

Заранее спасибо.

Обновление enter image description here

Ответы [ 3 ]

0 голосов
/ 19 марта 2019

Вы можете выяснить, когда этого не происходит, удалив небольшие фрагменты функциональности (или отдельные строки) - тогда вы знаете, что вызывает это.Тем не менее, я не могу найти место, где вы останавливаете петлю?Может быть, это отправляет запрос каждые 30 секунд и никогда не останавливается?

0 голосов
/ 19 марта 2019

Размер кучи Js медленно увеличивается.

Это не обязательно утечка памяти.Это происходит, так как большинство движков используют сборщик мусора «остановить мир», что означает, что переменные останутся в памяти, хотя они могут уже быть собраны, а затем в какой-то момент включается GC, останавливает исполняемый в настоящий момент JS, проверяет все ссылкии освобождает память, на которую больше не ссылаются, а затем продолжает выполнение (это делается так, поскольку JS очень динамичен, вы не можете указать, что переменная, выходящая из области видимости, полностью разыменована, если вы проверяете все переменные сразу, вы знаете,наверняка).

Однако это делает сборку мусора дорогостоящей операцией.Поэтому GC пытается включить как можно реже, что означает, что он срабатывает, только если требуется память (поскольку она заполнена).

Поэтому у вас не обязательно есть утечка памяти (и яне вижу ни одного в коде).Наблюдайте за кучей в течение более длительного промежутка времени и подождите несколько циклов gc или запустите их вручную (тогда выглядит как пила), затем проверьте, увеличивается ли общий график.Если это так, у вас есть утечка памяти, поскольку есть элементы, которые выживают при сборе мусора, они протекают.

Есть ли способ узнать, где именно происходит утечка памяти?

Используя большинство отладчиков, вы можете создать «снимок» текущего состояния памяти.Возьмите две из них, одну до и после сборки мусора, затем сравните их, чтобы выяснить, что именно утечка, и обычно это можно отследить до кода, который его пропускает.

0 голосов
/ 19 марта 2019

Вам нужно использовать clearInterval(createRequest);

Когда вам больше не нужен запущенный код.

...