Visual Basic .NET에서 가비지 컬렉션(Garbage Collection, GC)은 사용하지 않는 객체를 해제하여 메모리 누수를 방지하는 자동 메모리 관리 프로세스입니다. 객체가 생성될 때 관리되는 힙에서 메모리가 할당되며, 객체에 대한 참조가 더 이상 없으면 시간에 따라 가비지 컬렉터가 자원을 해제합니다.
특징:
Finalize 메서드를 구현할 수 있지만, IDisposable 인터페이스와 Dispose 메서드를 사용하는 것이 더 신뢰할 수 있습니다.Dispose 메서드를 호출하기 위해 Using 구문을 사용하세요.Dispose를 사용하는 코드 예시:
Public Class FileManager Implements IDisposable Private disposed As Boolean = False ' ... 관리되지 않는 자원 Public Sub Dispose() Implements IDisposable.Dispose If Not disposed Then ' 자원 해제 disposed = True End If GC.SuppressFinalize(Me) End Sub Protected Overrides Sub Finalize() Dispose() MyBase.Finalize() End Sub End Class
프로그램 종료 시 객체의 파이널라이저가 호출될 것이라고 확신할 수 있나요?
잘못된 답변: 네, 객체가 더 이상 필요하지 않을 때 자동으로 파이널라이저가 호출됩니다.
올바른 답변: 아니요, 프로세스 종료 시 파이널라이저의 호출은 보장되지 않습니다. GC가 이를 처리할 수 있는 경우에만 파이널라이저가 호출됩니다. 자원을 안전하게 해제하기 위해 항상 Dispose를 사용하세요.
예시:
' 자원의 안전한 해제를 위한 Using 구문 사용 Using mgr As New FileManager() ' 자원 작업 End Using
사례
파일 처리를 위한 프로젝트에서 임시 파일이 삭제되지 않았습니다. 이는 파이널라이저에만 의존했기 때문입니다. 파일의 양이 많아지면서 파일 시스템이 과부하에 걸리기 시작하였고, 명시적으로Dispose호출을 추가해야 했습니다.
사례
개발자가 매 작업 후 수동으로GC.Collect()를 호출했습니다. 이로 인해 자주 가비지 수집이 발생하여 응용 프로그램의 성능이 급격히 저하되었습니다.
사례
대형 웹 애플리케이션에서 한 서비스가 Dispose 패턴을 잘못 구현하였고GC.SuppressFinalize()를 호출하지 않았습니다. 이로 인해 객체가 이중으로 정리되었고, 예상치 못한 장애와 자원 누수가 발생했습니다.