2016-08-21 33 views
0

stackoverflow。我用C#編寫了一個應用程序(一個raytracer)。問題不在於raytracer,而在於ray的使用。隨着時間的推移,應用會持續消耗更多的內存使用太多內存的C#應用​​程序

RAM的使用,而不是光線追蹤:開始10MB爬呀爬

拉姆usege而光線追蹤:開始80MB然後120MB及以上,如果分辨率是大 這個數字高達500MB。

我看着VS診斷工具,並看到應用程序垃圾收集就像10分鐘在1 gc。這個數字更大,而應用程序是光線追蹤。光線追蹤器返回一個巨大的像素數組。在光線跟蹤之後,我將pixel array設置爲null,但應用程序RAM在500-600 mb ram範圍內。

是否有任何選項可以收集更多的垃圾或免費公羊?

編輯 這是一個WinForms應用程序,而不是WPF或其他東西。

+1

爲什麼500MB _too much_?當它有用時它會將mem返回給系統。你正在看錯號碼。 –

+0

即使在光線追蹤500mb仍然存在於程序存儲器中之後,500mb的光線追蹤並不多。 –

+0

@Yahya Gedik,使用內存分析器,例如[dotMemory](https://www.jetbrains.com/dotmemory/)獲取更多詳細信息。你可能有內存泄漏。 –

回答

1

我不能確定,因爲沒有代碼,但它聽起來像內存泄漏。驗證是否沒有引用有問題的對象的靜態對象。要驗證,在將對象設置爲null之後運行GC.Collect(),因爲如果它在第2代中,垃圾收集器可能需要一段時間才能檢查它並回收它的內存。如果在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診斷工具能夠快照應用程序的內存使用情況,以確定它正在使用的位置以及存在的類類型。進一步的信息和示例使用了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識別內存泄漏」等平臺也將有所幫助。

通常的內存泄漏是由錯誤的處置和循環引用的保留引起的,因此請在循環引用出現的代碼中標識出任何位置。