我用WP#在WPF中开发了一个应用程序。该应用程序包括用于在特定窗口中显示相机的第三方dll。
通常,应用程序占用内存为90 MB - 135 MB,没有相机对象(非托管对象)。即我删除了在设计和代码页(xaml和xaml.cs)中重写相机对象的所有代码。内存增加并停在一个最大值。
如果我在应用程序中使用相机对象,则内存会逐渐增加。当我每次打开相机窗口时,内存将逐渐增加,如135 MB 141 MB,143 MB ....
我已将 GC.Collect 和使用语句用于清除托管内存所需的所有位置。我无法减少或停止增加内存。
如何解决这个问题?
任何建议都会表示赞赏
提前致谢。
答案 0 :(得分:2)
使用GC.Collect
通常不会减少内存占用。不要再打电话了,你可能会看到一些改进。
更一般地说,您不必担心.NET应用程序的感知空间(特别是如果您通过任务管理器监视它!)。 .NET运行时将在需要时释放内存 - 例如在压力下或空闲时 - 因此您看到的值并不一定表示它使用更多内存 - 它只是暂时保留内存。
一个可以证明这一点的小测试:当您最小化.NET应用程序时会发生什么?通常,您会看到任务管理器中的内存使用量急剧下降,并且在重新显示窗口时不会立即恢复。
答案 1 :(得分:1)
似乎您已回答了自己的问题:
如果我在应用程序中使用相机对象,则内存为 逐渐增加。当我每次打开相机窗口时, 内存将逐渐增加,如135 MB 141 MB,143 MB ....
我已经将GC.Collect和Using语句用于所有必要的地方 清除托管内存。我无法减少或停止 记忆力增加。
如上所述,GC.Collect仅对托管对象执行垃圾收集,而不是非托管对象。我假设内存泄漏来自您使用的相机对象,而不是来自托管代码。那你为什么要责怪GC.Collect高内存上升呢?
这就是为什么我把责任归咎于相机对象:
通常,应用程序将内存分为90 MB - 135 MB 相机对象(非托管对象)。即我删除了所有代码重写 设计和代码页中的相机对象(xaml和xaml.cs)。该 记忆增加并停在一个最大值。
如果我在应用程序中使用相机对象,则内存为 逐渐增加。当我每次打开相机窗口时, 内存将逐渐增加,如135 MB 141 MB,143 MB ....
然后你应该调查你使用的相机控制。很明显,罪魁祸首是相机控制。
答案 2 :(得分:1)
非托管相机组件是否有C#包装器?如果是这样,它实现了IDisposable?确保您处置相机对象(如果已包装)将在非托管代码中调用其析构函数
非托管代码是否通过DLL导入连接到您的C#代码?如果是这样,请确保调用所有“Close()”类型方法来释放C#中的内存。我建议将相机组件包装在你自己的.NET类中,实现IDisposable,以便整齐地打包它
您订阅了任何.NET事件而不是取消订阅吗?比如Camera.ImageReceived + = new EventHandler ...... 保留对.NET事件的订阅打开可能会导致细微的内存泄漏,因为GC在有引用时无法收集对象(通过事件订阅)
最后,检查内存泄漏的原始测试是让您的应用程序在多个创建/删除摄像头窗口操作的情况下运行一夜。看看第二天是否收到OutOfMemoryException。正如以前的海报所提到的,任务管理器不会准确报告.NET应用程序的内存使用情况,但是,测试是GC最终会释放内存还是无限期地增长?