문제

.NET CF 응용 프로그램에서 메모리 누출에 문제가 있습니다.

사용 RPM 동적으로 생성 컨트롤이 예상대로 수집 된 쓰레기가 아님을 확인했습니다. .NET 창 양식에서 동일한 코드를 실행하는 것은 다르게 행동하고 예상대로 제어를 처리합니다.

Perfmon을 통해 RPM의 출력을 참조하십시오 프로세스 힙 카운터:
alt text

GC 힙 :
alt text

내 가장 좋은 추측은 패널에 대한 약한 참조가 객체를 GC에 적합하지 않은 것으로 알려지지 않은 이유입니다.

참고 : 일지라도 dispose () 샘플의 문제를 해결하면 샘플이 더 이상 사용되지 않는시기를 결정하기 위해 명확한 컷이 아니기 때문에 기존 응용 프로그램에 쉽게 통합 할 수 없습니다.

문제를 설명하기 위해 단순화 된 버전의 소스를 포함 시켰습니다.

using System;
using System.Windows.Forms;

namespace CFMemTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // Calling this event handler multiple times causes the memory leak
        private void Button1_Click(object sender, EventArgs e)
        {
            Panel uc = new Panel();
            // Calling uc.Dispose() cleans up the object 
        }
    }
}

업데이트:
1. GC.collect ()를 호출해도 패널이 정리되지는 않습니다.
2. Windows CE 4.2 장치에서 .NET CF 2.0 SP1 사용.

도움이 되었습니까?

해결책

이 행동을 설명하는 몇 가지 추가 정보.

Ilya Tumanov에 따르면:

NetCF와 관련된 모든 UI가 GC 범위에서 의도적으로 제거되므로 수집되지 않습니다.. 이 동작은 데스크탑과 다르며 NetCF v3.5에서 변경되었습니다 (호환 모드에서 실행되지 않는 한).

NetCF의 관리되는 UI 클래스가 데스크탑과 완전히 다르기 때문에 매우 다릅니다. 그들은 허용 가능한 성능을 달성하기 위해 필요한 기본 구현에 대한 얇은 포장지입니다.

그런 자원이 있는지 확실하지 않습니다. 그러나 실제로, 당신이 알아야 할 것은 다음과 같습니다. 그것은 결코 수집되지 않았으며, 처분해야합니다. 당신은 실제로 데스크탑에서도 그렇게해야하지만 더 용서하지 않는다면 그렇게해야합니다. NetCF에서는 그렇지 않습니다.

다른 팁

양식은 코드에 생성 된 모든 컨트롤을 자동으로 폐기하지 않습니다. 양식을 배치 할 때 양식을 자동으로 처리 할 양식을 얻으려면 컨트롤 컬렉션에 추가해야합니다.

이제 당신의 경우에는 아무것도하지 않을 수 있습니다. 당신의 모범이 고안되어 있는지 또는 실제 세계인지 알 수 없습니다. 실제 세계 인 경우 변수가 범위를 벗어나면 패널이 수집되지 않기 때문에 동작이 예상됩니다 (데스크탑에서도 확실하지 않음). 컬렉션이 가능해 지지만 다음 컬렉션 패스에서는 스윕 될 것임을 의미합니다. GC를 일으키지 않으면 해방되지 않을 것입니다.

나는 당신이 그것을 살펴 보는 것이 좋습니다 CF의 메모리 관리에 대한 MSDN 웹 캐스트. 그것은 우리가 여기서 답을 제공 할 수있는 것보다 훨씬 더 많은 것들에 대한 훨씬 더 철저한 설명을 제공합니다.

Are you sure you have a memory leak? The .NET Compact Framework garbage collector works slightly differently to the one in the full .NET framework. From Steven Pratschner's blog:

A collection is initiated when either:

  • 1MB of objects have been allocated,

  • An application is moved to the background,

  • A failure to allocate memory occurs

  • An application calls GC.Collect.

I think you need to dynamically remove the Button Click EventHandler too, as you can see from this blog : http://blogs.msdn.com/stevenpr/archive/2007/03/08/finding-managed-memory-leaks-using-the-net-cf-remote-performance-monitor.aspx

It is from Steven Pratschner too.

By the way, the webcast mentioned above is linked here: http://msevents.microsoft.com/cui/WebCastEventDetails.aspx?culture=en-US&EventID=1032318791&CountryCode=US

Hope this helps!

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