2012-02-09 3 views
0

나는 내 응용 프로그램에서 하나의 이미지를 폴더에서 처리하고있다. (나는 while 루프에서 이미지를 처리하고있다.) 폴더는 1000 개 이상의 images.i를 사용하고있다. 가비지 콜렉션 (GC.Collect()). 1000 이미지 처리 후 OutOfMemoryException (비트 맵 이미지를 그림 상자에 할당 할 때 예외가 발생 함),이 문제를 해결하는 방법은 무엇입니까?C에서 OutOfMemoryException을 해결하는 방법 #

+0

오류를 생성하는 함수는 무엇입니까? – Gabe

+0

비트 맵 이미지가 그림 상자에 할당 될 때 예외가 발생합니다. –

+1

절대 GC.Collect() ..를 사용하면 안됩니다. 특히 루프가 아닙니다. 이것은 실제로 문제를 일으키고, 모든 개체 생성을 업그레이드하며, GC를 쓸모 없게 만듭니다. 심지어 문제 자체를 일으킬 수도 있습니다 ... 아래의 다른 해결책을 참조하고 수집 방법 –

답변

0

이미지 사용 방법에 따라 다릅니다. 관련 인스턴스를 처분하지 않을 가능성이 있습니다. using 문을 사용하여 문장을 래핑 해보십시오.

using (var image = ...new instance created...) 
{ 
    // ...do stuff... 
} 
0

메모리 누수를 찾으십시오. WinDbg를 gcroot 명령과 함께 사용할 수 있습니다. 아래 링크를 참조하십시오.

http://blogs.msdn.com/b/delay/archive/2009/03/11/where-s-your-leak-at-using-windbg-sos-and-gcroot-to-diagnose-a-net-memory-leak.aspx

당신은 용의자를 조사 할 필요가있다. SOS 디버깅 확장을 사용할 수 있습니다.

!DumpHeap -type LeakingClass 

는 다음 주소로 GCRoot 전화와 메모리에서 개체를 핀 무엇을 참조하십시오 : 다음 명령은 당신에게 메모리에 클래스의 인스턴스와 그 주소의 목록을 제공합니다

!GCRoot <your address here> 

당신 DumpHeap 명령의 결과에서 주소를 붙여 넣을 수 있습니다.

1

아니요. 그것은 나쁜 일을하지 않고 그 예외를 얻으려면 toallyally 좋아. 대형 힙 프레 그먼트는 여전히 해결되지 않은 문제입니다.

주 응용 프로그램의 제어하에 이미지가 다 끝났거나 다시 시작될 때까지 이미지에서 작동하는 별도의 프로세스를 열거 나 64 비트로 이동하는 것이 가장 좋습니다 (조각난 문제가 발생할 가능성이 적음) . 비트 맵 이미지가있는 PictureBox

이 하나 개의 청크에 많은 메모리를 필요로 할당 될 때

예외 관통한다. 그 이미지들에 대해 알려주시겠습니까? 그들은 얼마나 큰가? 왜 picturebox (일괄 처리는 일반적으로 이미지를 볼 필요가 없습니다.) 여하튼, 이것은 문제를 정의하고 이미지가 클 경우 예상됩니다.

+0

하나의 이미지 크기는 1MB입니다 (비트 맵 이미지) –

+0

메모리 또는 디스크에 1MB를 의미합니까? 메모리 크기는 얼마입니까? 메모리의 1MB는 ​​문제가되지 않습니다. 디스크의 1MB 이미지는 수백 MB의 메모리가 될 수 있습니다. 그리고 나서 당신은 fragemtation 문제를 겪게됩니다. 문제의 예를 보려면 http://connect.microsoft.com/VisualStudio/feedback/details/521147/large-object-heap-fragmentation-causes-outofmemoryexception을 확인하십시오. – TomTom