문제와 목표

이벤트 리스너 누수에서 바꿀 결과와 유지할 기존 동작을 한 문장씩 적습니다. 동일한 target에 listener를 반복 등록하고 제거하지 않으면 callback과 캡처된 state가 남아 중복 실행과 메모리 증가를 만듭니다.

원인에 맞는 준비

메모리 문제는 한 시점의 사용률이 아니라 시간에 따른 할당률, 작업 종료 뒤 기준선과 참조 경로를 봐야 합니다. heap과 native·buffer·파일 캐시를 분리하면 제한을 늘려야 하는지, 참조를 끊어야 하는지가 달라집니다. 현재 version의 공식 문서와 실제 설정을 확인하고 대표·경계·실패 사례를 준비합니다. Performance profile, heap snapshot, allocation timeline, long task와 promise rejection을 재현 입력과 함께 수집한다.

순서 할 일
1 수정 전 결과와 되돌릴 기준 저장
2 핵심 사실과 맞닿은 한 곳만 변경
3 같은 입력으로 수정 전후 비교

해결 순서와 완료 조건

반복 횟수, 컬렉션, queue와 cache에 상한을 두고 상태를 만든 소유자가 listener·timer·handle까지 정리하게 합니다. 메모리 제한 상향은 원인 수정 뒤의 안전 여유로만 사용합니다. 작업 수명주기와 소유권을 명시하고 입력·반복·동시성·출력 크기에 상한을 둔다. 예상과 다르면 변경을 더 얹지 말고 처음 달라진 값으로 돌아갑니다. 정답뿐 아니라 실행 시간, 할당량, GC, 이벤트 루프 지연과 취소 후 남은 작업을 비교한다. 동일 부하를 충분히 오래 유지한 뒤 GC 이후 live set과 RSS 기준선, allocation rate, 처리량과 pause가 함께 안정되는지 확인합니다.

공식 문서와 적용 범위

문서의 기본값과 동작은 version에 따라 달라질 수 있습니다. 현재 runtime·framework version, 실제 입력과 요청 흐름에서 다시 확인합니다.