개발 지식

개발 지식

Go time.After는 남용하면 메모리 누수난다

페이지 정보

profile_image
영삼이
0건 108회 25-03-28 15:10

본문

✅ time.After는 남용하면 메모리 누수난다

타이머는 쓰고 나면 반드시 처리해야 한다

Go에서 타임아웃을 줄 때 흔히 이렇게 쓴다:

select {
case <-ch:
	// 작업 완료
case <-time.After(5 * time.Second):
	// 타임아웃 처리
}

문제는 time.After가 내부적으로
타이머 객체를 만들고 GC 될 때까지 유지된다는 것


❌ 반복해서 쓰면 메모리 계속 쌓임

for {
	select {
	case <-someChan:
	case <-time.After(time.Second): // 루프 돌 때마다 타이머 새로 생성
	}
}
  • 오래 돌리는 프로그램에서 타이머가 계속 누적됨

  • 메모리 누수 발생


✅ 해결: time.NewTimer + Stop() 사용

for {
	timer := time.NewTimer(time.Second)

	select {
	case <-someChan:
	case <-timer.C:
	}

	if !timer.Stop() {
		<-timer.C // 잔여 타이머 제거
	}
}

✔️ time.After일회성 타이밍에만 사용
반복이나 장시간 프로세스엔 반드시 직접 타이머를 관리해야 한다.

댓글목록

등록된 댓글이 없습니다.