Должны ли мы использовать Async / Await или Then Closures для предотвращения утечки памяти? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть это приложение NodeJS, которое использует слишком много памяти.Мы пытаемся отследить источник проблемы.

Поэтому я прочитал, что замыкания вредны для использования памяти.Сборщик мусора испытывает трудности с освобождением памяти, используемой замыканиями.

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

thenableFunction().then(() => {...}).then(() => {...}).catch(() => {...});

Так что, прочитав о замыканиях, я подумал реорганизовать всена

try{
    let result = await thenableFunction();
    ...
}catch(e){...}

Теперь мне интересно, выиграем ли мы от такого рода рефакторинга или это все равно ничего не даст.

Что вы думаете?Любые хорошие ссылки, которые вы знаете, объясняющие это?

спасибо

1 Ответ

0 голосов
/ 15 мая 2018

await, по сути, является синтаксическим сахаром именно того кода, который вы заменяете (хорошо, за исключением того, что любой код, следующий за вашим блоком кода, также эффективно добавляется к предложению then - как это * Ключевое слово 1002 * эффективно блокирует выполнение до разрешения Promise). Так что этот рефакторинг не должен влиять на потребление памяти.

Конкретный ответ на вопрос будет зависеть от двух вопросов. Во-первых, избегает ли перезапись замыканий (которые явны в исходном коде), а во-вторых (при условии, что ответ на первый вопрос - да), будет ли сборщик мусора отказывать в замыканиях GC так же, как и в том, что делает Обещание ( если это не подразумеваемое создание замыканий).

Я почти уверен, что ответ на первый вопрос - нет - что await Promise действительно создает неявные замыкания. Поэтому я не думаю, что вы избегаете их в первую очередь.

И по второму вопросу, из моего прочтения, похоже, что замыкания приводят только к причудливым проблемам с сборкой мусора (то есть утечкам) в некоторых особых случаях:

https://www.ibm.com/developerworks/library/wa-use-javascript-closures-efficiently/index.html

https://auth0.com/blog/four-types-of-leaks-in-your-javascript-code-and-how-to-get-rid-of-them/

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

...