В течение более месяца я борюсь с очень неприятной проблемой утечки памяти, и я понятия не имею, как ее решить.Утечка памяти в приложении для искателя node.js
Я пишу веб-гуру общего назначения на основе: http, async, cheerio и nano. С самого начала я боролся с утечкой памяти, которую было очень сложно изолировать. Я знаю, что можно сделать heapdump и проанализировать его с помощью Google Chrome, но я не могу понять результат. Обычно это куча бессмысленных строк и объектов, приводящих к некоторым анонимным функциям, которые ничего не говорят мне (это может быть недостаток опыта на моей стороне).
В конце концов я пришел к выводу, что библиотека, которую я использовал в то время (jQuery), имела проблемы, и я заменил ее на Cheerio. У меня сложилось впечатление, что Черио решил проблему, но теперь я уверен, что она сделала ее менее драматичной.
Вы можете найти мой код по адресу: https://github.com/lukaszkujawa/node-web-crawler. Я понимаю, что может быть много кода для анализа, но, возможно, я делаю что-то глупое, что может быть очевидным. Я подозреваю, что основной класс агента, который выполняет HTTP-запросы https://github.com/lukaszkujawa/node-web-crawler/blob/master/webcrawler/agent.js из нескольких «потоков» (с async.queue
).
Если вы хотите запустить код требует CouchDB и после npm install
сделать:
$ node crawler.js -c conf.example.json
Я знаю, что узел не сойти с ума от сбора мусора, но после 10мина тяжелого ползания используемой памяти может легко переходите на 1 ГБ.
(проверено с v0.10.21 и v0.10.22)
Вы сохранили меня с этим предложением: «Это небольшая утечка памяти сама по себе, но несущественная. Странно, что строка каким-то образом связана со всем объектом HTML и сохраняет ссылку на нее». Я потратил три полных дня, пытаясь найти то, что протекал в моем коде, и я обнаружил, что это связано с массивом URL-адресов. Затем я увидел это сообщение и попытался сломать ссылки, используя 'JSON.parse (JSON.stringify (item))'. Моя утечка памяти мгновенно и волшебным образом исчезла. Мне жаль, что я не видел этот пост раньше. –