У меня есть метод, который порождает дочерний процесс, у которого есть слушатели событий и обработчики внутри него.
Мой вопрос:
Будет ли сборщик мусора очищать контекст метода или он останется в памяти, пока не будет создано все приложение
import { spawn } from 'child_process';
class SomeThing {
initChildProcess() {
const childProcess = spawn('go', [ 'run', 'awesome.go' ])
// what will happen to this context
// will garbage collector clear it?
childProcess.once('close', () => {
// when I re-invoked it inside this event handler?
this.initChildProcess()
})
}
}
С кодом, который вы показываете, как только ваш внутренний вызов this.initChildProcess()
вернется (что будет быстро, потому что spawn()
асинхронный), тогда ваш первоначальный вызов initChildProcess()
будет выполнен, и объект childProcess
из этого вызова будет находиться в закрытом состоянии и без дополнительных прослушивателей событий (или событий, которые могут произойти), поэтому он будет иметь право на сборку мусора.
Что будет с контекстом метода (памятью), когда я повторно вызову метод внутри обработчика событий внутри него?
Смотрите выше условия для сбора мусора. С тем, что вы показываете, это будет мусор. Повторный вызов не имеет никакого отношения к контексту, связанному с исходным вызовом.
Будет ли сборщик мусора очищать контекст метода или он останется в памяти, пока не будет создано все приложение
Это очистит это. Второй вызов spawn()
не имеет ссылки на код первого, поэтому первый будет иметь право на сборку мусора, как только будет выполнен собственный код, стоящий за первым spawn()
или как только у вас больше не будет прослушивателей событий в первом объект childProcess
. Это сделает объект childProcess
недоступным для любого кода и, следовательно, пригодным для сборки мусора.