Ошибка node.js в памяти - PullRequest
8 голосов
/ 26 ноября 2010

FATAL ERROR: CALL_AND_RETRY_2 Allocation Failed - process out of memory

Я вижу эту ошибку и не совсем уверен, откуда она. Проект, над которым я работаю, имеет такой основной рабочий процесс:

  1. Получение сообщения XML из другого источника
  2. Разобрать XML, используя xml2js
  3. Извлечение необходимой информации из вновь созданного объекта JSON и создание нового объекта.
  4. Отправить этот объект подключенным клиентам (используя socket.io)

Узловые модули используются:

  • xml2js
  • socket.io
  • хореограф
  • MySQL

Когда я получаю пакет XML, первым делом я записываю его в файл log.txt на тот случай, если что-то нужно будет просмотреть позже. Я сначала fs.readFile, чтобы получить текущее содержимое, а затем написать новое содержимое + старый. Файл log.txt, вероятно, занимал около 2400 КБ во время последнего сбоя, но после перезапуска сервера он снова работает нормально, поэтому я не считаю, что это проблема.

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

Редактировать

Принимая во внимание то, что узел работает постоянно, я должен использовать delete <object> после того, как каждый объект, который я использую, выполняет свое назначение, например var now = new Date(), который я использую для сравнения с событиями, которые происходили в прошлом Или результат объекта из шага 3 после того, как я передал его обратному вызову?

Редактировать 2

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

function parsingFunction(callback) {
    //Construct Object
    callback(theConstructedObject);
}

parsingFunction(function (data) {
   masterObject[someIdentifier] = data;
});

Редактировать 3

В качестве еще одного шага для устранения неполадок я сбросил process.memoryUsage().heapUsed прямо перед запуском парсера на parser.on('end', function() {..}); и проанализировал несколько пакетов xml. Наибольшая используемая куча была около 10-12 МБ на протяжении всего теста, хотя в нормальных условиях программа находится на уровне 4-5 МБ. Я не думаю, что это особенно нарушает условия сделки, но может помочь в поиске проблемы.

1 Ответ

2 голосов
/ 08 октября 2011

Возможно, вы случайно закрываете объекты рекурсивно. Сумасшедший пример:

function f() {
  var shouldBeDeleted = function(x) { return x }

  return function g() { return shouldBeDeleted(shouldBeDeleted) }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...