【发布时间】:2010-10-11 15:41:50
【问题描述】:
应用背景
我们的平台是一个单击一次的 WPF 应用程序。我们有一个包含导航菜单结构的“shell”,它承载我们自己的自定义“页面”类。当您导航到新页面时,我们会(基本上)换掉 shell 的内容。
问题
所以,我在一家从事大型软件项目的公司工作。我们发现有很多代码存在内存问题。
问题在于,我们的应用程序中有很多地方是事件是有线的,而不是非有线的。我不确定开发人员为什么要这样做,我猜他们希望每次用户导航到新的“页面”时都会清理对象。
我们没有重构每个页面的选项(在此版本中)。 C# 有没有办法从对象中删除所有引用? (因此允许垃圾收集器将该对象连同它的所有内部引用一起丢弃)
我们正在尝试取回这些内存,但是当我们需要处理 WPF 时,要找到仍在引用我们的页面(对象引用)的对象是相当复杂的。
我们查看了视觉和逻辑树,并使用分析应用程序来帮助我们手动清理事物(以证明这个想法),这也被证明是非常困难的。
我坐下来想,为什么我们要做所有这些工作来查找对象引用,我们不能在关闭时“取消引用”这个“页面”吗?
这把我带到了这里:)
非常感谢任何帮助!
更新 1
在 cmets 中询问了以下内容:
问:应用。真的有记忆问题吗?这些是如何展示/检测的?还是在 GC2 发生之前这段记忆一直存在? – 米奇小麦
答:内存有问题。如果我们离开一个页面(保存页面的属性被设置为一个新对象),旧对象永远不会被垃圾收集器收集。所以记忆只是不断增长。如果我们公司重新开始,请使用此应用程序。我们应该看的第一件事是实现 WeakEvent 模式并在 WPF 中使用更多路由命令。
更新 2
我能够想出自己的solution。
【问题讨论】:
-
应用程序。真的有记忆问题吗?这些是如何展示/检测的?还是在 GC2 发生之前这段记忆一直存在?
标签: c# memory-management pointers object object-reference