C# 应用程序使用太多 ram

C# application using too much ram

计算器溢出。我用 C#(光线追踪器)编写了一个应用程序。问题不在于光​​线追踪器,而在于光线的使用。随着时间的推移,应用程序不断消耗更多的内存。

不进行光线追踪时的 Ram 使用情况:从 10mb 开始不断增加

Ram 在光线追踪时使用:开始 80mb,然后 120mb 及以上,如果分辨率很大 这个数字最大为 500mb。

我查看了 VS 诊断工具,发现应用程序垃圾收集大约在 1 分钟内进行了 10 次 gc。当应用程序进行光线跟踪时,这个数字甚至更大。 Raytracer returns 一个巨大的像素阵列。我在光线追踪后将像素阵列设置为空,但应用程序 ram 停留在 500-600 mb ram 的范围内。

是否有任何选项可以收集更多垃圾或释放内存?

编辑 这是一个 WinForms 应用程序,而不是 WPF 或其他东西。

我能否建议您尝试确定是否有任何内存泄漏导致您的应用程序内存使用量逐渐增加。有许多免费和付费工具可用于完成此任务,以及关于如何使用它们的无尽建议。 vs 诊断工具能够对您的应用程序的内存使用情况进行快照,以确定它在何处使用以及存在哪些 class 类型。可以在此处找到有关 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 identify memory leaks”也会有所帮助。

内存泄漏通常是由循环引用的不正确处理和保留引起的,因此请找出代码中存在循环引用的任何位置。

我不能确定,因为没有代码,但听起来像是内存泄漏。确认没有静态对象引用有问题的对象。要验证,运行 GC.Collect() 在将对象设置为 null 之后,因为如果它在第 2 代中,例如垃圾收集器可能需要一段时间来检查它并回收它的内存。如果在 GC.Collect 之后你发现内存没有被回收,你很可能在某个地方发生了内存泄漏。如果找不到 rouge reference 的位置,可以使用这样的工具 https://blogs.msdn.microsoft.com/visualstudioalm/2015/04/29/diagnosing-event-handler-leaks-with-the-memory-usage-tool-in-visual-studio-2015/
祝你好运