문제

내 응용 프로그램에는 실행 시간에 동적으로 생성되는 많은 RichTextBox가 있습니다. 응용 프로그램에 RichTextBox 컨트롤로 인한 메모리 누출이 있음을 깨달았습니다. 제어로 인해 메모리가 누출되었음을 증명하기 위해 다음 테스트 방법을 작성했습니다.

for (int i = 0; i < 3000; i++)
        {
            Control rich = new RichTextBox();
            pnl.Content = rich;
        }
GC.Collect();
GC.WaitForPendingFinalizers();

PNL XAML 코드로 선언 된 컨텐츠 콘트롤입니다.
다음 코드를 실행하면 메모리 사용이 빠르게 증가하고 있음을 알 수 있습니다.

문제를 해결하는 방법이 있습니까? 나는 객체 풀을 만드는 것을 고려했지만 이것은 내 응용 프로그램을 복잡하게 만들고 오히려 그것을 피할 것입니다.


편집하다: 나는 쓰레기 수집가에 전화를 추가하여 객체가 수집되지 않았 음을 입증했습니다. GC 수집 방법에 대한 호출이 있거나없는 메모리 사용이 개선되지 않습니다. 전화하십시오 rich.Dispose 루프 내에서 메모리 사용량 성장을 제거합니다.

도움이 되었습니까?

해결책

다른 곳에서 이것을 발견했으며 내 테스트에 관한 한 올바른 것 같습니다.

FlowDocument가 생성되면 구조 캐시에서 비교적 비싼 형식 컨텍스트 개체도 생성됩니다. 단단한 루프로 여러 개의 FlowDoc을 생성하면 각 flowdoc마다 구조 캐시가 생성됩니다. 루프 끝에서 GC.Collect에 메모리를 복구하기를 희망합니다. StructuralCache에는 최종화기 가이 형식 컨텍스트를 릴리스하지만 즉시 그렇지는 않습니다. Finalizer는 DispatcherPriority.background에서 컨텍스트를 해제하기 위해 작업을 효과적으로 예약합니다.

따라서 RichTextBox (또는 FlowDocument)는 배경 스레드에서 청소를 기다리는 것만으로 누출되지 않습니다. 그것이 정확히 누가 아는가. 나는 이것이 즉시 청소를 강요하는 처분 방법을 구현했으면 좋겠다.

다른 팁

응용 프로그램에 메모리 누출이 있다는 표시가 아니므로 응용 프로그램이 많은 기억을 사용합니다. 경우 누출입니다 RichTextBox 컨트롤은 범위에서 벗어난 후 어느 시점에서 릴리스되지 않습니다 (관리되는 객체의 메모리 누출 감지는 악명 높고 어렵고 입증 할 수 없습니다).

범위가 떨어지지 않는 물체가 수집 된 객체가 수집된다는 일반적인 오해. 이것은 단지 그것을 만듭니다 자격이 있는 수집됩니다. 대상은 이론적으로 할 수 있습니다 절대 응용 프로그램이 종료 될 때까지 수집됩니다. 그것이 자라는 사실 RichTextBox 다른 컨트롤과 함께하지 않으면 메모리 누출이 있음을 나타내는 것은 아닙니다. RichTextBox, 그것은 단지 다른 컨트롤보다 인스턴스 당 더 많은 메모리를 사용한다는 표시 일뿐입니다. 이 정보는 유용 할 수 있지만 메모리 누출이 있는지 여부를 결정할 때 도움이되지 않습니다.

우리는 Winforms 2.0에서도 같은 문제가 있었고 제 3 자 풍부한 텍스트 컨트롤을 구입해야했습니다. Microsoft가 문제를 해결하지 않았다고 생각합니다 ...

이것은 나에게 문제를 해결했다.http://blaycode.blogspot.com/2010/10/memory-leak-with-wpfs-richtextbox.html

기본적으로 각 RichTextbox에 두 가지 속성을 추가합니다 :) isundoenabled = "false"

편집과 관련하여 :

GC 통화를 추가했습니다 ~ 후에 루프는 종료되고 모두 3000을 모두 종료합니다 RichTextBoxES가 만들어졌습니다.

새로운 것을 교체 할 때 이전의 것이 루프 내부에서 해제되지 않는다는 것이 이상하게 보이지만, GC가 루프 전에 "일을 할 기회를 얻지 못할 것"이라는 꽉 찬 루프입니다. 종료됩니다.

나는 그것이 좋은 생각이라고 생각하지 않지만 (테스트 코드에서는 괜찮을 것임), 루프 내부에서 GC 통화를 이동 시키려고 했습니까?

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