문제

메모리가 누출되는 것처럼 보이는 WindowsForms 앱이 있으므로 Redgate의 Ants Memory Profiler를 사용하여 내가 생각하는 객체를보고 이미 객체에 의해서만 보관되어 있음을 알게되었습니다. 파이널 라이저 큐. 훌륭합니다. 정확히 Finalizer 대기열은 무엇입니까? 당신은 나를 최고의 정의를 지적 할 수 있습니까? 일화 조언을 공유 할 수 있습니까?

또한 Finalizer 대기열의 모든 루트 GC 객체는 인스턴스입니다. System.Windows.forms.control+Thread Methodentry "발신자"라는 객체. 나는 그것이 멀티 스레드 UI 상호 작용에 관여한다는 것을 알지만, 그 이상을 많이 알지 못한다. 저의 명백한 게으름을 용서하고 무지를 인정하지만 이러한 자원은 모두 공급 업체의 구성 요소 내에 묻혀 있습니다. 나는 이러한 문제에 대해 공급 업체와 이야기하고 있지만 대화 속도를 높이기 위해 약간의 방향이 필요합니다. Thread Methodentry의 가장 유용한 정의를 지적 할 수 있습니까? 일화 조언이 있습니까?

또한 Finalizer 대기열에서 이러한 객체에 대해 걱정해야합니까?

업데이트: 이것 레드 게이트 기사 도움이되었습니다.

도움이 되었습니까?

해결책

Finalizer 큐는 Finalizer 메소드가 정의 된 모든 객체를 보유합니다. Finalizer는 핸들과 같은 관리되지 않는 자원을 수집하는 수단이라는 것을 상기하십시오. 쓰레기 수집가가 쓰레기를 수집하면 최종화기가있는 객체를 최종화기 큐로 이동합니다. 어느 시점에서, 메모리 압력, GC 휴리스틱 및 달의 단계에 따라 쓰레기 수집기가 이러한 물체를 수집하기로 결정하면 대기열을 걸어 최종화기를 실행합니다.

과거에 메모리 누출로 작업 한 후 Finalizer 큐에서 공급 업체의 객체를 보는 것은 조잡한 코드 일 수 있지만 메모리 누출을 나타내는 것은 아닙니다. 일반적으로 좋은 코드는 관리되는 자원과 관리되지 않은 리소스를 모두 수집하는 처분 방법을 노출 시키며,이를 통해 최종화기 큐에서 스스로를 제거합니다. GC.SuppressFinalize(). 따라서 공급 업체의 객체가 Dispose 메소드를 구현하고 코드가 호출되지 않으면 Finalizer 큐에서 많은 객체로 이어질 수 있습니다.

두 지점 사이의 개미에서 스냅 샷을 만들고 그 사이에 생성 된 객체를 비교해 보셨습니까? 이는 유출되는 관리 객체를 식별하는 데 도움이 될 수 있습니다.

또한 최종화기가 실행될 때 메모리가 사라지는 지 확인하려면 다음과 같이 테스트하도록 시도하십시오.

System.GC.Collect();
System.GC.WaitForPendingFinalizers(); // this method may block while it runs the finalizers
System.GC.Collect();

이 코드를 정상적으로 실행하지 않는 것이 좋습니다. 방금 많은 일을하고 많은 쓰레기를 만들었다면 실행하고 싶을 수도 있습니다. 예를 들어, 우리의 앱에서 우리의 기능 중 하나는 MDI 창을 닫은 후 폐기물로 이동하는 약 350MB의 쓰레기를 만들 수 있습니다. 이것은 많은 쓰레기를 남기는 것으로 알려져 있기 때문에 수동으로 쓰레기 수집을 강요합니다.

또한 기본 Windows.forms 코드에는 마지막 열린 모달 대화 상자를 유지할 수있는 저수준 속성 캐시가 있습니다. 이것은 메모리 누출의 원천 일 수 있습니다. 이 참조를 제거하는 한 가지 확실한 방법은 또 다른 간단한 대화 상자가 나타나고 위의 GC 코드를 실행하는 것입니다.

다른 팁

Finalizer 큐는 더 이상 사용되지 않는 객체 인스턴스가 GC에 의해 완료되기를 기다리는 큐입니다. 이 대기열의 모든 객체는 마무리되고 메모리 누출은 아마도이 객체 중 하나에서 직접 나오지 않을 것입니다. 그러나 이러한 개체 중 하나가 관리되지 않는 모든 자원을 출시 할 수는 없습니다.

Thread Methodentry 클래스는 IASyncresult의 구현 이며이 클래스의 인스턴스는 일반적으로 UI를 업데이트하거나 시작*/end* 메소드를 사용하는 등 비동기 작업을 호출 할 때 생성됩니다.

여기에 있습니다 비슷한 문제를 설명하는 좋은 블로그 게시물. 보다 기술적 인 수준에서 Sos.dll (블로그 게시물이 설명)을 사용하고 Sosex.dll 이 스레드 메트로 드리 객체가 메모리에 매달려있는 이유를 해결하는 데 도움이됩니다. 이 WINDBG 확장에는 메모리의 특정 객체를 참조하는 다른 객체를 추적 할 수있는 명령이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top