2014-09-01 1 views
0

Я преследовал довольно плохую утечку памяти в узловой программе.node.js memwatch преследует утечку памяти

Я использую модуль memwatch HeapDiff(), чтобы попытаться идентифицировать оскорбительные объекты.

отчет HeapDiff показывает два подозрительных элементов в деталях массива, («массив» и «String», каждый из которых значительно выросли.

Я официально потерял и не имеют ни малейшего представления о том, как сузить возможный преступники Есть десятки google-способных howtos, но ни один из них не имеет для меня никакого смысла. В рассматриваемой программе используется довольно много сторонних модулей, включая операторский, dequeue и mqtt. Это 318 строк кода, поэтому я не опубликовал это.

Я бы признателен за любые указатели, как к тому, что мой следующий шаг должен быть ...

Вот выдержка из memwatch HeapDiff отвала:

{ 
    "before": { 
     "nodes": 25312, 
     "time": "2014-09-01T10:59:24.000Z", 
     "size_bytes": 3596320, 
     "size": "3.43 mb" 
    }, 
    "after": { 
     "nodes": 125705, 
     "time": "2014-09-01T11:14:24.000Z", 
     "size_bytes": 20255728, 
     "size": "19.32 mb" 
    }, 
    "change": { 
     "size_bytes": 16659408, 
     "size": "15.89 mb", 
     "freed_nodes": 674, 
     "allocated_nodes": 101067, 
     "details": [ 
      { 
       "what": "Array", 
       "size_bytes": 348440, 
       "size": "340.27 kb", 
       "+": 1592, 
       "-": 295 
      }, 
      { 
       "what": "String", 
       "size_bytes": 12580056, 
       "size": "12 mb", 
       "+": 50329, 
       "-": 20 
      } 
     ] 
+0

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

ответ

2

Без образцов кода, это трудно получить в подробности, но на высоком уровне ...

То, что я делал, было смотреть не только на категории которые были самыми большими (потому что мои были также Array и String [1]), но искали типы объектов, которые я мог отслеживать; найдите строки, которые имеют какой-либо заметный рост, и уникальные поисковые «какие» записи, а затем найдите, где они находятся в вашем коде. Внесите новые отличия в ваше использование этих и узких или разбросанных до тех пор, пока вы не найдете свои точки роста.

Если вы не можете найти подозрительные объекты, просто разделите свой основной путь выполнения на две или три части и запустите HeapDiffs для каждого из них. (То, что вы используете для запуска вашего HeapDiff? Запуск и .он («утечка»)?)

  1. Кстати, это не говорит, что есть одна строка, это 12mb. Он говорит, что строки размером в 12 Мб - на самом деле, 12mb больше строк, чем были на переднем конце разницы. Эти 12mb распределены по 50329 новым строкам. Тем не менее, они достаточно большие.
0

Могу ли я предложить вам попробовать инструменты IDDE и посмотреть, поможет ли это вам отслеживать утечку? см. это [ссылка] :(What diagnostic tools are available for Node.js applications?) для получения дополнительной информации. Если вам нужно больше информации для начала, я более чем счастлив помочь.