Утечка памяти, включающая запросы Ajax jQuery

Я думаю you't, просто отсутствующий эти -c флаг. Например:

:.!python -c "print 'hello'"

Вы не должны, что сценарий, что Вы обеспечиваете действия как фильтр на выборе строки. Таким образом, Ваш сценарий может читать от stdin для работы непосредственно на данные строки (., %...). Что-то большее чем самые простые задачи, однако, и Вы были бы более обеспеченным помещением команд Python в собственный файл сценария.

6
задан Community 23 May 2017 в 10:09
поделиться

3 ответа

Я не уверен, почему Firefox не доволен этим, но по опыту могу сказать, что в IE6 / 7 / 8 необходимо установить innerHTML = ""; на объекте, который вы хотите удалить из DOM. (если вы создали этот элемент DOM динамически, то есть)

$ ("# content tbody"). empty (); может не освобождать эти динамически сгенерированные элементы DOM.

Вместо этого попробуйте что-то вроде следующего ( это плагин jQuery, который я написал для решения проблемы).

jQuery.fn.removefromdom = function(s) {
    if (!this) return;

    var bin = $("#IELeakGarbageBin");

    if (!bin.get(0)) {
        bin = $("<div id='IELeakGarbageBin'></div>");
        $("body").append(bin);
    }

    $(this).children().each(
            function() {
                bin.append(this);
                document.getElementById("IELeakGarbageBin").innerHTML = "";
            }
    );

    this.remove();

    bin.append(this);
    document.getElementById("IELeakGarbageBin").innerHTML = "";
};

Вы бы назвали это так: $ ("# content"). removefromdom ();

Единственная проблема здесь в том, что вам нужно заново создавать свою таблицу каждый раз, когда вы хотите ее построить.

Кроме того, если это решит вашу проблему в IE, вы можете прочитать об этом больше в блоге сообщение , которое я написал ранее в этом году, когда столкнулся с той же проблемой.

Edit Я обновил плагин выше, чтобы он теперь на 95% свободен от JavaScript, поэтому он использует больше jQuery, чем предыдущая версия. Вы все равно заметите, что мне нужно использовать innerHTML, потому что функция jQuery html (""); не действует так же для IE6 / 7/8

Изменить Я обновил плагин выше, чтобы он теперь на 95% свободен от JavaScript, поэтому он использует больше jQuery, чем предыдущая версия. Вы все равно заметите, что мне нужно использовать innerHTML, потому что функция jQuery html (""); не действует так же для IE6 / 7/8

Изменить Я обновил плагин выше, чтобы он теперь на 95% свободен от JavaScript, поэтому он использует больше jQuery, чем предыдущая версия. Вы все равно заметите, что мне нужно использовать innerHTML, потому что функция jQuery html (""); не действует так же для IE6 / 7/8

11
ответ дан 8 December 2019 в 16:06
поделиться

Я не уверен насчет утечки, но ваша функция resetTable () очень неэффективна. Попробуйте сначала исправить эти проблемы и посмотрите, чем вы закончите.

  • Не добавляйте в DOM цикл. Если вы должны выполнить манипуляции с DOM, затем добавить к фрагменту документа, а затем переместить этот фрагмент в DOM.
  • Но innerHTML в любом случае быстрее, чем манипуляции с DOM, поэтому используйте его, если можете.
  • Сохраняйте наборы jQuery в локальные переменные - нет необходимости повторно запускать селектор каждый раз.
  • Также сохраняйте повторяющиеся ссылки в локальной переменной.
  • При итерации по коллекции любого вида сохраняйте длину в локальной переменной. тоже.

Новый код:

<html> <head>
    <title>Test Page</title>
    <script type="text/javascript"
     src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
</head> <body>
<script type="text/javascript">
$(function()
{
    var $tbody = $("#content tbody");

    function kickoff() {
        $.getJSON("test.php", resetTable);
    }

    function resetTable(rows)
    {
        var html = ''
          , i = 0
          , l = rows.length
          , row;
        for ( ; i < l; i++ )
        {
            row = rows[i];
            html += "<tr>"
                + "<td>" + row.mpe_name + "</td>"
                + "<td>" + row.bin + "</td>"
                + "<td>" + row.request_time + "</td>"
                + "<td>" + row.filtered_delta + "</td>"
                + "<td>" + row.failed_delta + "</td>"
            + "</tr>";
        }
        $tbody.html( html );
        setTimeout(kickoff, 2000);
    }

    kickoff();
});
</script>
<table id="content" border="1" style="width:100% ; text-align:center">
<thead>
    <th>MPE</th> <th>Bin</th> <th>When</th> <th>Filtered</th> <th>Failed</th>
</thead>
<tbody></tbody>
</table>
</body> </html>

Ссылки:

4
ответ дан 8 December 2019 в 16:06
поделиться

Пожалуйста, поправьте меня, если я ошибаюсь, но разве SetTimeout (fn) не предотвращает освобождение памяти вызывающего абонента? Чтобы все переменные / память, выделенная во время метода resetTable (rows), оставались выделенными до завершения цикла?

В этом случае передача конструкции строки и логики appendTo другому методу может быть немного лучше, поскольку эти объекты получат освобождается после каждого вызова, и в памяти останется только память возвращенного значения (в данном случае либо строковая разметка, либо ничего, если новый метод выполнил appendTo ()).

По сути:

Первоначальный вызов для kickoff

-> Вызов resetTable ()

-> -> SetTimeout Вызывает повторный запуск

-> -> -> Вызывает resetTable () снова

-> -> -> -> Продолжать до бесконечности

Если код так и не разрешится, дерево будет продолжать расти.

Альтернативный способ освобождения некоторой памяти на основе этого был бы похож на приведенный ниже код:

function resetTable(rows) {
    appendRows(rows);
    setTimeout(kickoff, 2000);
}
function appendRows(rows)
{
    var rowMarkup = '';
    var length = rows.length
    var row;

    for (i = 0; i < length; i++)
    {
        row = rows[i];
        rowMarkup += "<tr>"
                + "<td>" + row.mpe_name + "</td>"
                + "<td>" + row.bin + "</td>"
                + "<td>" + row.request_time + "</td>"
                + "<td>" + row.filtered_delta + "</td>"
                + "<td>" + row.failed_delta + "</td>"
                + "</tr>";      
    }

    $("#content tbody").html(rowMarkup);
}

Это добавит разметку к вашему телу и затем завершит эту часть стека. Я почти уверен, что каждая итерация «строк» ​​все равно останется в памяти; однако строка разметки и тому подобное должны в конечном итоге освободиться.

Опять же ... прошло много времени с тех пор, как я смотрел SetTimeout на этом низком уровне, поэтому здесь я могу полностью ошибиться. В любом случае это не устранит утечку и только, возможно, снизит скорость роста. Это зависит от того, как сборщик мусора используемых движков JavaScript справляется с циклами SetTimeout, как здесь.

function resetTable(rows) {
    appendRows(rows);
    setTimeout(kickoff, 2000);
}
function appendRows(rows)
{
    var rowMarkup = '';
    var length = rows.length
    var row;

    for (i = 0; i < length; i++)
    {
        row = rows[i];
        rowMarkup += "<tr>"
                + "<td>" + row.mpe_name + "</td>"
                + "<td>" + row.bin + "</td>"
                + "<td>" + row.request_time + "</td>"
                + "<td>" + row.filtered_delta + "</td>"
                + "<td>" + row.failed_delta + "</td>"
                + "</tr>";      
    }

    $("#content tbody").html(rowMarkup);
}

Это добавит разметку к вашему телу, а затем завершит эту часть стека. Я почти уверен, что каждая итерация «строк» ​​все равно останется в памяти; однако строка разметки и тому подобное должны в конечном итоге освободиться.

Опять же ... прошло много времени с тех пор, как я смотрел SetTimeout на этом низком уровне, поэтому я могу полностью ошибиться. В любом случае это не устранит утечку и только, возможно, снизит скорость роста. Это зависит от того, как сборщик мусора используемых движков JavaScript справляется с циклами SetTimeout, как здесь.

function resetTable(rows) {
    appendRows(rows);
    setTimeout(kickoff, 2000);
}
function appendRows(rows)
{
    var rowMarkup = '';
    var length = rows.length
    var row;

    for (i = 0; i < length; i++)
    {
        row = rows[i];
        rowMarkup += "<tr>"
                + "<td>" + row.mpe_name + "</td>"
                + "<td>" + row.bin + "</td>"
                + "<td>" + row.request_time + "</td>"
                + "<td>" + row.filtered_delta + "</td>"
                + "<td>" + row.failed_delta + "</td>"
                + "</tr>";      
    }

    $("#content tbody").html(rowMarkup);
}

Это добавит разметку к вашему телу, а затем завершит эту часть стека. Я почти уверен, что каждая итерация «строк» ​​все равно останется в памяти; однако строка разметки и тому подобное должны в конечном итоге освободиться.

Опять же ... прошло много времени с тех пор, как я смотрел SetTimeout на этом низком уровне, поэтому я могу полностью ошибиться. В любом случае это не устранит утечку и только, возможно, снизит скорость роста. Это зависит от того, как сборщик мусора используемых движков JavaScript справляется с циклами SetTimeout, как здесь.

Я посмотрел на SetTimeout на этом низком уровне, так что могу ошибаться здесь. В любом случае это не устранит утечку и только, возможно, снизит скорость роста. Это зависит от того, как сборщик мусора используемых движков JavaScript справляется с циклами SetTimeout, как здесь.

Я посмотрел на SetTimeout на этом низком уровне, поэтому могу ошибаться здесь. В любом случае это не устранит утечку и только, возможно, снизит скорость роста. Это зависит от того, как сборщик мусора используемых движков JavaScript справляется с циклами SetTimeout, как здесь.

0
ответ дан 8 December 2019 в 16:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: