утечка памяти в jsdom и node.js

Я нашел несколько ссылок на людей, имеющих аналогичную проблему, где всегда был ответ, убедитесь, что вы вызвали window.close (), когда закончите. Однако, похоже, это не работает для меня (узел 0.8.14 и jsdom 0.3.1)

Простое воспроизведение

var util = require('util');
var jsdom=require('jsdom');

function doOne() {
  var htmlDoc = '<html><head></head><body id="' + i + '"></body></html>';
  jsdom.env(htmlDoc, null, null, function(errors, window) {
    window.close();
  });
}

for (var i=1;i< 100000;i++ )  {
  doOne();
  if(i % 500 == 0)  {
    console.log(i + ":" + util.inspect(process.memoryUsage()));
  }
}
console.log ("done");

Я получаю вывод

500:{ rss: 108847104, heapTotal: 115979520, heapUsed: 102696768 }
1000:{ rss: 198250496, heapTotal: 194394624, heapUsed: 190892120 }
1500:{ rss: 267304960, heapTotal: 254246912, heapUsed: 223847712 }
...
11000:{ rss: 1565204480, heapTotal: 1593723904, heapUsed: 1466889432 }

В этот момент вентилятор отключается и тест фактически останавливается ... или, по крайней мере, начинает работать очень медленно

Есть ли у кого-нибудь другие советы, кроме window.close, чтобы избавиться от утечки памяти (или это точно похоже на утечку памяти)

Спасибо!

Петр

11 голосов | спросил Peter 15 SatEurope/Moscow2012-12-15T18:43:19+04:00Europe/Moscow12bEurope/MoscowSat, 15 Dec 2012 18:43:19 +0400 2012, 18:43:19

4 ответа


0

Использование jsdom 0.6.0 для очистки некоторых данных и столкновения с той же проблемой.
window.close только помогло замедлить память утечка, но это в конечном итоге подкрадывалось, пока процесс не был убит.

Запуск сценария с node --expose-gc myscript.js

Пока они не устранят утечку памяти, кажется, что вручную вызывается сборщик мусора в дополнение к вызову window.close:

if (process.memoryUsage().heapUsed > 200000000) { // memory use is above 200MB
    global.gc();
}

Застрял, что после вызова window.close. Использование памяти немедленно возвращается к исходному уровню (около 50 МБ для меня) при каждом срабатывании. Едва заметная остановка.

ответил CheapSteaks 25 Mayam13 2013, 10:49:52
0

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

Это подтверждается ответом CheapSteaks, который вручную запускает сборку мусора. В jsdom не может быть утечки памяти, если это работает, поскольку утечки памяти по определению не позволяют сборщику мусора собирать утечку памяти.

ответил Domenic 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 10 Sep 2013 16:51:37 +0400 2013, 16:51:37
0

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

надеюсь, это сработает и для тебя.

Daniel

ответил BeMoreDifferent.com 16 SunEurope/Moscow2012-12-16T17:46:37+04:00Europe/Moscow12bEurope/MoscowSun, 16 Dec 2012 17:46:37 +0400 2012, 17:46:37
0

с gulp, использованием памяти, очисткой, удалением переменной, window.close ()

var gb = setInterval(function () {

    //only call if memory use is bove 200MB
    if (process.memoryUsage().heapUsed > 200000000) { 
        global.gc();
    }

}, 10000); // 10sec


gulp.task('tester', ['clean:raw2'], function() {

  return gulp.src('./raw/*.html')
    .pipe(logger())
    .pipe(map(function(contents, filename) {


        var doc = jsdom.jsdom(contents);
        var window = doc.parentWindow;
        var $ = jquery(window);

        console.log( $('title').text() );

        var html = window.document.documentElement.outerHTML;

        $( doc ).ready(function() {
            console.log( "document loaded" );
            window.close();
        });

        return html;
    }))
    .pipe(gulp.dest('./raw2'))
    .on('end', onEnd);
});

и у меня было постоянное использование 200 - 300 МБ для файлов 7 КБ. это заняло 30 минут. Это могло бы быть полезно для кого-то, поскольку я гуглил и не нашел ничего полезного.

ответил Hontoni 17 WedEurope/Moscow2014-12-17T02:38:41+03:00Europe/Moscow12bEurope/MoscowWed, 17 Dec 2014 02:38:41 +0300 2014, 02:38:41

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132