我不确定我是否在正确的 StackOverFlow 论坛上发帖,但这里是。
我有一个 C# 桌面应用程序。它接收来自 4 个模拟摄像机的图像,并尝试检测运动,如果是,则保存它。
当我让应用程序运行超过 24 小时周期时,我注意到任务管理器中的专用工作集几乎攀升了 500%。
现在,我知道使用任务管理器不是一个好主意,但它确实会告诉我是否出现问题。
为此,我从 JetBrains 购买了 dotMemory profiler。
我使用其工具确定堆第 2 代的大小增加了很多。然后在较小程度上还有大对象堆。
后者令人惊讶,因为图像大小为 360x238,而字节数组大小始终小于 20K。
所以,我的问题是:
例如,我应该显式调用 GC.Collect(2) 吗? 我应该担心我的应用程序在某种程度上对此负有责任吗?
最佳答案
Andrew,我的建议是在 dotMemory 中拍摄内存快照,然后探索它以找到保留大部分内存的内容。 This video会帮助你。如果您不确定 GC.Collect,您只需点击“强制 GC”按钮,它就会收集应用程序中所有可用的垃圾。
关于memory-leaks - 第 2 代堆和大对象堆爬升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26202103/