2012-10-08 2 views
2

메모리 누수가있는 VB.NET으로 작성된 서비스가 있습니다. 기억은 많이하지 않을 때에도 커집니다. 그것은 작업 관리자에서 약 29,000 K를 사용하여 시작하고 시간이 지나면 얼마나 바쁜지에 따라 50 만 K 또는 때로는 1,000,000 K 이상으로 증가합니다. 일부 고객의 경우 이로 인해 서버에서 메모리 문제가 발생합니다. 서비스에는 하루에 한 번 서비스를 다시 시작하는 자동 재시작 기능이 있지만 때로는이 정도면 충분하지 않으므로 하루에 여러 번 Windows 스케줄러에서 net stop/start를 사용해야합니다..NET 메모리 누수 - System.WeakReference 개체가 누적됩니다.

PerfMon은 서비스가 실행되는 동안 "Gen 2 힙 크기"가 계속 증가하는 것을 보여 주지만 다른 힙 번호는 실행되지 않습니다. 물론 "# 개의 바이트가 모든 힙에 있음"은 해당 숫자를 포함하고 있기 때문에 커집니다.

실행중인 서비스의 덤프 파일을 만들 때 windbg에서 열고 SOS를로드하고 "! dumpheap -stat"을 실행하면 가장 많은 수의 개체가 "System.WeakReference"클래스가됩니다. 지금보고있는 예제에서는 총 4,636,227 개 개체 중 4,542,785 개가 있습니다.

내가 읽은 바로는이 객체는 GC에서 작업중인 객체에 대한 참조를 보유하는 데 사용됩니다. 그렇다면 왜 GC가 끝났을 때 이들을 GC하지 않을까요? WeakReference 객체가 보유하고있는 객체를 확인하는 방법이 있습니까?

감사합니다.

+0

'WeakReference' 클래스는 참조 된 객체를 저장하는'Target' 속성을 가지고 있습니다. 귀하의 서비스는 '약점'을 많이 사용합니까? –

+0

아니요, 우리는 전혀 신고하지 않습니다. 내가 알 수 있듯이 GC는 처리 과정에서이를 사용하고 있습니다. – zonebob

+1

WeakReference는 프레임 워크의 다른 클래스 중 System.Web.Caching에서 사용됩니다. WeakReference가 뿌리 내린 것을 확인할 수 있습니까? – PHeiberg

답변

2

WeakReference는 개체에 대한 약한 참조를 유지하지만, WeakReference -instance에 대한 참조 따라서, 어려운 : 당신이 (IsAlivefalse이다) 그들은 여전히 ​​메모리를 사용합니다 참조를 죽은 많이 개최합니다.

WeakReference을 목록에 저장하거나 다른 방법으로 저장하지 않았는지 확인하십시오.

편집 : 참조를 직접 소유하고 있지 않은 경우 issues with WithEvents in VB.NET이 원인 일 수 있습니다. 즉, 릴리스 모드에서 응용 프로그램을 컴파일하면 문제가 해결됩니다. according to Microsoft.

+0

명확히하기 위해, WeakReference로 아무것도 선언하지 않았습니다. 내가 알 수 있듯이 GC는 처리 과정에서이를 사용하고 있습니다. – zonebob

+1

WeakReference 객체의 샘플링에서! sos.gcroot를 실행하십시오. ! sosex.bhi를 실행하여 인덱스를 만든 다음 WeakReference 개체 샘플링시! mroot를 실행할 수도 있습니다. –

+0

@zonebob : WithEvents를 사용하고 있습니까? 편집 – larsmoa

0

코드에 WeakReference 클래스가 잘못 사용 된 것 같습니다. 코드를 찾고 해당 인스턴스를 구성하려면 할당 지점에서 전체 개체 수명을 추적 할 수있는 프로파일 링 도구 (예 : dotTrace Memory)를 사용하십시오. 누군가가 일부 컬렉션에서 약한 참조 인스턴스를 삭제하는 것을 잊었습니다. 찾기 및 수정.