【问题标题】:C# application using too much ramC# 应用程序使用太多内存
【发布时间】:2016-08-21 11:01:44
【问题描述】:

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

在不进行光线追踪的情况下使用内存:从 10mb 开始会上升

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

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

有没有办法收集更多垃圾或空闲内存?

编辑 这是一个 WinForms 应用程序,不是 WPF 什么的。

【问题讨论】:

  • 为什么 500MB 太多 ?它会在有用时将 mem 返回到系统。您正在查看错误的数字。
  • 光线追踪时500mb并不多,即使光线追踪后500mb仍然存在于程序内存中。
  • @Yahya Gedik,使用内存分析器,例如,dotMemory,以获取更多详细信息。您可能有内存泄漏。

标签: c# garbage-collection raytracing


【解决方案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/
祝你好运

【讨论】:

  • 谢谢,通过 VS 诊断工具,我找到了问题所在。我忘记在追踪之后但在返回之前删除光线追踪器图像数组。
【解决方案2】:

我能否建议您尝试确定是否有任何内存泄漏导致应用程序的内存使用量逐渐增加。有许多免费和付费工具可用于完成此任务,以及关于如何使用它们的无穷无尽的建议。 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 识别内存泄漏”也会有所帮助。

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

【讨论】:

    猜你喜欢
    • 2017-09-01
    • 1970-01-01
    • 2016-12-03
    • 2013-01-10
    • 2011-09-20
    • 2015-12-03
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    相关资源
    最近更新 更多