2014-11-14 5 views
0

하나의 양식 만 있고 작은 notifyIcon 개체 만있는 작은 C# winform 응용 프로그램이 있습니다. 양식은 실제로 사실상 표시되지 않습니다. 마우스를 아이콘 위로 이동하면 .Text 속성을 업데이트하기 위해 알림 아이콘을 코딩했습니다. 나는 그 위에 마우스를 올리면 메모리가 꾸준히 8 바이트 씩 증가한다는 것을 알았다.알림 아이콘 메모리 누출?

.Text 속성을 반복해서 설정한다는 것은 확실합니다. 문자열은 불변이고 새로운 하나는 각 setter와 함께 만들어 지므로 이것을 이해할 수는 있지만 가비지 수집기가 결국 정리할 것이라고 생각했습니다.

메모리가 증가하지 않도록하려면 어떻게해야합니까? TimeSpan 객체가 클래스 수준 객체로 사용하려고 시도 했으므로 TimeSpan 객체가 범인이 될 가능성을 배제하고 두 번 이상 인스턴스화하지 않았습니다. 이것은 다른 결과를 제공하지 않았으므로 지금은 매번 새로운 인스턴스를 선언하고 인스턴스화합니다. 코드에서

private const string TEMPLATE = "Time remaining: {0}h {1}m {2}s"; 
     private void notifyIcon1_MouseMove(object sender, MouseEventArgs e) 
     { 
      TimeSpan ts = new TimeSpan((_targetTime - DateTime.Now).Ticks); 
      notifyIcon1.Text = string.Format(TEMPLATE, ts.Hours, ts.Minutes, ts.Seconds); 
      //I think it's this .Text property that's increasing the memory usage. 
     } 
+0

왜 메모리가 증가하지 않아야합니까? 메모리 부족 예외가 발생합니까? – Roger

+4

메모리 사용량을 어떻게 지켜보고 있습니까? 작업 관리자를 보는 중이라면 신뢰할 수 없다는 것을 알고 있어야합니다. 기억이 바운드없이 증가한다는 것이 확실한가요? 이런 식으로 기억이 부족합니까? 계속하면 잠시 후 메모리 사용량이 줄어 듭니 까? 가비지 수집기는 정리하기 전에 메모리 사용량을 상당히 증가시킵니다. 과도한 메모리 압박이없는 한 정리할 특별한 이유가 없습니다. 가장 중요한 점은 표시하는 코드가 실제 메모리 누수라는 사실은 매우 드뭅니다. –

+0

테스트 용 : 새로운 문자열을'notifyIcon1.Text'에 할당 한 후'GC.Collect'를 호출하십시오. 그렇다면 메모리가 여전히 계속 묻고 있는지 확인하십시오. – Fabio

답변

1

, 그것은 분명히 메모리를 할당 string.Format(..) 기능입니다.
여기서 볼 수 있듯이이 메서드는 문자열의 '복사본'을 반환합니다. http://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx#Format_Returns
주석에 제안 된대로 코드가 메모리 누수를 확실히 생성하지 않고 가비지 수집기가 게으른 구현이며 사용하지 않은 메모리를 수집 할 이유가 거의 없을 것입니다.