编程语言
首页 > 编程语言> > 有没有一种很好的方法来执行WPF / C#对象解除引用,用于垃圾回收?

有没有一种很好的方法来执行WPF / C#对象解除引用,用于垃圾回收?

作者:互联网

应用背景

我们的平台是一次点击WPF应用程序.我们有一个包含导航菜单结构的“shell”,它托管我们自己的自定义“页面”类.当您导航到新页面时,我们会换掉shell的内容(基本上).

问题

所以,我为一家正在开展一个非常大的软件项目的公司工作.我们有很多代码,我们发现了内存问题.

问题是我们的应用程序中有很多地方是事件是有线的,从来没有连线.我不确定为什么开发人员会这样做,我猜他们希望每次用户导航到新的“页面”时都能清理对象.

我们没有选择重构每个页面(在此版本中).有没有办法用C#删除对象的所有引用? (因此允许垃圾收集器抛弃该对象及其所有内部引用)

我们试图恢复这个内存,但是当我们有WPF来处理时,发现对象仍然引用我们的页面(对象引用)是非常复杂的.

我们已经查看了视觉和逻辑树,并使用了分析应用程序来帮助我们手动清理(以证明这个想法),这也被证明是非常困难的.

我坐下来思考,为什么我们要做所有这些工作来找到对象引用,我们不能只是在关闭时“取消引用”这个“页面”吗?

这让我来到这里:)
任何帮助是极大的赞赏!

更新1

在评论中提出以下问题:

问:应用程序吗?实际上有记忆问题?这些如何展出/检测?或者在GC2发生之前这个记忆是否存在? – 米奇麦

答:它有记忆问题.如果我们离开页面(保存页面的属性设置为新对象),旧对象永远不会被垃圾收集器收集.因此记忆不断增长.如果我们公司重新开始,请使用此应用程序.我们应该首先考虑的是实现WeakEvent模式并在WPF中使用更多的路由命令.

更新2

我能够拿出自己的solution.

解决方法:

你使用过CLRProfiler吗?我发现这很擅长找到对象,也找到了对它们的引用.

这个“如何”页面……

http://msdn.microsoft.com/en-us/library/ms979205.aspx

…链接到下载站点.

但是,我认为你的问题的答案是“不”.没有办法说“不再需要对象foo – 无论它是否根深蒂固,都要收集它”.收集有根对象可能会在您的应用中引入各种不良内容.

标签:c,memory-management,object,pointers,object-reference
来源: https://codeday.me/bug/20190710/1423996.html