2016-08-21 6 views
0

stackoverflow. C# (raytracer)에서 응용 프로그램을 작성했습니다. 문제는 raytracer가 아닌 광선 사용입니다. 응용 프로그램은 시간이 지남에 따라 더 많은 RAM을 소비합니다. 해상도는이 숫자가 5백메가바이트에 달려있다 큰 경우, 최대 다음 1백20메가바이트을 80메가바이트를 시작하고 : 레이트 레이싱되지 동안너무 많은 램을 사용하는 C# 응용 프로그램

램 사용량 : 레이트 레이싱 동안 10메가바이트 시작은 최대 최대

램 usege 간다.

VS Diagnostics 도구를 사용하여 응용 프로그램 가비지 수집이 1 분에 10gc와 비슷한지 확인했습니다. 응용 프로그램이 광선 추적을하는 동안이 숫자는 더 커집니다. Raytracer는 거대한 픽셀 배열을 반환합니다. raytracing 후 null로 픽셀 배열을 설정했지만 응용 프로그램 RAM은 500-600 MB RAM 범위에 고정됩니다.

가비지 또는 프리 램을 추가로 수집 할 수있는 옵션이 있습니까?

EDIT 이것은 WPF 또는 다른 형식이 아닌 WinForms 응용 프로그램입니다.

+1

왜 500MB _ 왜 많이입니까? 유용 할 때 mem를 시스템에 반환합니다. 잘못된 번호를보고 있습니다. –

+0

500mb는 레이 트레이싱 중에도, 심지어 500mb의 레이 트레이싱이 여전히 프로그램 메모리에 남아있는 동안에도 그리 많지 않습니다. –

+0

@Yahya Gedik, 자세한 내용을 보려면 메모리 프로파일 러 (예 : [dotMemory] (https://www.jetbrains.com/dotmemory/))를 사용하십시오. 메모리 누수가있을 수 있습니다. –

답변

1

코드가 없으므로 확신 할 수 없지만 메모리 누수처럼 들릴 수 있습니다. 문제가있는 객체를 참조하는 정적 객체가 없는지 확인합니다. 확인하려면 GC.Collect()를 실행하십시오. 예를 들어, 생성자 2에서 가비지 수집기가이를 확인하고 메모리를 회수하는 데 시간이 걸릴 수 있으므로 개체를 null로 설정 한 후 실행하십시오. GC.Collect 후에 메모리가 회수되지 않았 음을 확인하면 어딘가에서 메모리 누수가 발생할 가능성이 큽니다. 루즈 참조의 위치를 ​​찾을 수없는 경우 다음과 같은 도구를 사용할 수 있습니다. https://blogs.msdn.microsoft.com/visualstudioalm/2015/04/29/diagnosing-event-handler-leaks-with-the-memory-usage-tool-in-visual-studio-2015/
행운을 빌어 요.

+0

감사합니다. VS 진단 도구를 사용하여 문제가있는 곳을 파악했습니다. 추적 후에는 돌아 오기 전에 raytracer 이미지 배열을 삭제하는 것을 잊지 않습니다. –

0

메모리 누수가 응용 프로그램의 메모리 사용이 점진적으로 증가하는 데 기여하는지 확인하려고 시도해 볼 것을 권장합니다. 이 작업을 수행하는 데 사용할 수있는 무료 및 유료 도구가 많으며 사용 방법에 대한 끝없는 조언이 제공됩니다. vs diagnostics 도구에는 응용 프로그램의 메모리 사용을 스냅 샷하여 해당 응용 프로그램이 사용중인 위치와 어떤 클래스 유형이 있는지를 식별하는 기능이 있습니다. 추가 정보와 VS 진단 도구 사용의 예는 여기에서 찾을 수 있습니다 : https://channel9.msdn.com/Shows/Visual-Studio-Toolbox/Visual-Studio-2015-Diagnostic-Tools

또한 도움말 : What strategies and tools are useful for finding memory leaks in .NET?

유사 검색을 여기에 ".NET 메모리 누수를 확인"및 기타 플랫폼도 도움이 될 것입니다 위해.

일반적으로 메모리 누수는 부정확 한 폐기와 순환 참조의 보존으로 인해 발생하므로 순환 참조가있는 코드의 모든 위치를 식별하십시오.