计算器。我用C#(光线跟踪器)编写了一个应用程序。问题不在于光线跟踪器,而在于使用光线。应用程序随着时间的推移不断消耗更多内存。
Ram使用而不是光线追踪:从10mb开始上升
当光线追踪时拉姆使用:如果分辨率很大,则开始80mb然后120mb及以上 这个数字高达500mb。
我查看了VS Diagnostics工具,看到应用程序垃圾收集在1分钟内就像10 gc一样。这个数字甚至更大,而应用是光线追踪。 Raytracer返回一个巨大的像素阵列。我在光线追踪后将像素数组设置为null,但应用程序ram卡在500-600 mb范围内。
有没有选择收集更多垃圾或免费ram?
修改 这是一个WinForms应用程序,而不是WPF或其他东西。
答案 0 :(得分: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/之类的工具 祝你好运
答案 1 :(得分: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识别内存泄漏”的类似搜索也会有所帮助。
通常由于错误处理和保留循环引用而导致内存泄漏,因此请在代码中标识存在循环引用的任何位置。