FATAL ERROR: CALL_AND_RETRY_2 Allocation Failed - process out of memory
Я вижу эту ошибку и не совсем уверен, откуда она. Проект, над которым я работаю, имеет такой основной рабочий процесс:
- Получение сообщения XML из другого источника
- Разобрать XML, используя xml2js
- Извлечение необходимой информации из вновь созданного объекта JSON и создание нового объекта.
- Отправить этот объект подключенным клиентам (используя 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 МБ. Я не думаю, что это особенно нарушает условия сделки, но может помочь в поиске проблемы.