AbortSignal.any memory leak when circular dependencies
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- JavaScript
- Sterne
- 122k
- Forks
- 37.3k
- Ø Merge
- 4 T. 2 Std.
- Gemergte PRs (30 T.)
- 283
Beschreibung
Version
23.10.0
Platform
6.8.0-55-generic #57-Ubuntu SMP PREEMPT_DYNAMIC Wed Feb 12 23:42:21 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
Subsystem
No response
What steps will reproduce the bug?
class Test {
private abortController = new AbortController()
public test(cb: (abortSignal: AbortSignal) => void, abortSignal: AbortSignal) {
const signal = AbortSignal.any([abortSignal, this.abortController.signal])
cb(signal)
}
}
const registry = new FinalizationRegistry((heldValue) => {
console.log(`${heldValue} has been collected`)
})
;(() => {
const test = new Test()
registry.register(test, 'test')
const abortController = new AbortController()
test.test((abortSignal) => {
abortSignal.addEventListener('abort', () => {
console.log(test)
})
}, abortController.signal)
})()
global.gc?.()
setTimeout(() => {
console.log('the end')
}, 2000)
run with node --expose-gc test.ts
How often does it reproduce? Is there a required condition?
Every time
What is the expected behavior? Why is that the expected behavior?
the output should be
test has been collected
the end
because the test object is not referenced anymore
What do you see instead?
output:
the end
the test object is not garbage collected
Additional information
The issues seems to be caused by the cyclic dependency: test object => abortController field => abortSignal => AbortSignal.any result => cb function => test object
AbortSignal.any seems to prevent node from garbage collecting them all at once
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Führe die bereitgestellte Reproduktion mit node --expose-gc aus und untersuche die in der Issue beschriebene Interaktion zwischen AbortSignal.any, AbortController und FinalizationRegistry. Erledigt ist die Aufgabe, wenn das Testobjekt eingesammelt wurde und die Ausgabe sowohl „test has been collected“ als auch „the end“ enthält.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- javascript
- Bereich
- backend
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Aktiv
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 48/100