3

연결 풀 메모리 누수 문제 (예 : 연결이 제대로 닫히지 않는 경우)가있는 ASP.NET 응용 프로그램을 고려하십시오.IIS 응용 프로그램 풀 및 .NET 가비지 수집

응용 프로그램 풀을 재활용하면 연결 풀이 지워지므로 (더 많은 연결을 허용 할 수 있습니까)?

연결이 가비지 수집기가 메모리를 제거 할 때까지 메모리에 남아 있으면 응용 프로그램 풀이 다시 시작될 때 (또는 그 이상으로 남아있을 수 있습니까?) 발생합니까? 또한 Garbage Collector가 언제든지 정리할 수 있다고 생각하지만 사용 중이며 재설정 또는 응용 프로그램 풀이 다시 시작될 때까지는 수집 할 수 없습니까?

마지막 목표는 분명히 연결을 올바르게 관리하도록 코드를 수정하는 시스템을 검토하고 있으며 가비지 수집/응용 프로그램 풀 프로세스에 대한 이해를 높이려고합니다.

답변

5

예, 응용 프로그램 풀을 재활용하면 응용 프로그램을 실행하는 IIS 프로세스가 종료되고 다시 시작됩니다. 이 시점에서 프로세스가 종료되기 때문에 모든 리소스가 해제됩니다.

프로세스가 다시 시작되지 않고 단순히 핸들이 누수되는 경우 가비지 수집기가 결국 프로세스를 정리합니다. 그러나 이런 일이 발생하기 전에 누출되는 리소스가 무엇이든간에 핸들이 부족할 수 있습니다. 따라서 이러한 객체에 Dispose()를 호출하는 것이 중요합니다 (가급적이면 "using"패턴으로). 따라서 가비지 컬렉터가 주변에 도착할 때가 아니라 응용 프로그램이 끝나 자마자 리소스를 해제 할 수 있습니다.

1

연결 풀은 데이터베이스 연결의 캐시입니다. 응용 프로그램 풀은 하나 이상의 작업자 프로세스입니다. 따라서 응용 프로그램 풀을 종료하면 작업자 프로세스가 종료되고 새 작업자 프로세스가 시작됩니다. 이 경우 풀이 삭제되고 연결 풀의 모든 연결이 닫힙니다.

연결을 닫거나 Dispose를 호출하지 않고 가비지 수집기를 사용하는 경우 연결이 풀로 반환되거나 연결되지 않을 수 있습니다. 나는 그것이 연결이 여전히 유효하고 최대 풀 크기에 도달했을 때만 풀에 다시 추가 될 것이라고 생각한다. 아시다시피 가비지 수집기에 의존해서는 안됩니다. Disposed라는 쉬운 방법은 using 문을 사용하는 것입니다. using 문은 코드 블록의 끝에 자동으로 Dispose를 호출합니다.

ADO.NET 2.0에는 풀을 프로그래밍 방식으로 관리하는 새로운 방법 인 ClearAllPools 및 ClearPool이 있습니다. 이렇게하면 모든 데이터 액세스 코드를 수정할 수있을 때까지 문제 해결에 도움이 될 수 있습니다.

+0

나를 위해 운이 좋다 나는 고치기를해야하는 사람이되지 않을 것이다! 실제 문제는 응용 프로그램에서 datareader를 과도하게 사용하는 것입니다. try/catch/finally 블록이 없으므로 dispose 코드가 실행되지 않고 연결이 끊어져서 오류가 발생하면 ... – davidsleeps

+0

... 같은 실수가 몇 번이나 반복해서 나타나는 지 유감 스럽습니다. –