메모리 누수가있는 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 객체가 보유하고있는 객체를 확인하는 방법이 있습니까?
감사합니다.
'WeakReference' 클래스는 참조 된 객체를 저장하는'Target' 속성을 가지고 있습니다. 귀하의 서비스는 '약점'을 많이 사용합니까? –
아니요, 우리는 전혀 신고하지 않습니다. 내가 알 수 있듯이 GC는 처리 과정에서이를 사용하고 있습니다. – zonebob
WeakReference는 프레임 워크의 다른 클래스 중 System.Web.Caching에서 사용됩니다. WeakReference가 뿌리 내린 것을 확인할 수 있습니까? – PHeiberg